网站地图    收藏   

主页 > 前端 > javascript >

JavaScript namespace命名空间使用说明

来源:自学PHP网    时间:2014-09-19 14:47 作者: 阅读:

[导读] 说到namespace命名空间我想很多朋友都知道php有命名空间,asp.net有命名空间,那么我们要讲的是JavaScript的namespace命名空间哦,下面我来给各位介绍。...

写C或者JAVA习惯的人写JavaScript时可能会发现JavaScript并没有命名空间这一概念,当然如果没有接触过命名空间的程序猿(比如写js,PHP,Python)也可能对命名空间不关注或者不重视。这样的情况普遍存在,见过不少人写JavaScript时直接就全局变量的写,如:

 代码如下 复制代码

function a(){
 
}
 
function b(){
 
}

什么是命名空间呢?语言使用的一种代码组织的形式 通过名称空间来分类,区别不同的代码功能 。无论项目大小,如果一开始不严格按照命名空间来编写程序,当你写到上万行JavaScript程序的时候,我相信你一定会后悔你的object或者function命名已经很混乱了。所以建议童鞋们一开始就要养成命名空间的习惯,比如你要开发一个项目,功能可能如下:

 

那么你可以这样来命名:

 代码如下 复制代码

// 配置
var config = {};
 
// 前台
config.front = {};
 
// 后台
config.admin = {};
 
// 后台数据
config.admin.data = {};
 
// 后台模块
config.admin.module = {};
 
// 后台颜色模块
config.admin.module.color = {};
 
// 后台图片模块
config.admin.module.images = {};
 
// 后台搜索模块
config.admin.module.search = {};
 
 
 
// 给后台颜色模块加背景颜色改变功能
config.admin.module.color.changeBgColor = function(color) {
    document.body.style.background = color;
};
 
// 可以这么调用 
config.admin.module.color.changeBgColor('#F30');

我们看看这段object在内存中的结构

 

但是,以上声明命名空间的方式看起来不直观,我们来一个比较直观的结构化命名方式:

 代码如下 复制代码
// 配置
var config = {
    // 前台
    front : {},
     
    // 后台
    admin : {
        // 数据层
        data : {},
 
        // 模块层
        module : {
            // 颜色模块
            color : {
                // 背景颜色改变功能
                changeBgColor : function(color){
                    document.body.style.background = color;
                },
                // 前景颜色改变功能
                changeFnColor : function(color){
                    document.body.style.color = color;
                }
            },
 
            // 图片模块
            images : {
             
            },
 
            // 搜索模块
            search : {
 
            }
        }
    }
 
};
 
// 可以这么调用 
config.admin.module.color.changeBgColor('#F30');

以上的声明方式就把结构化很好的呈现出来了,利用命名空间非常方便的管理维护拓展程序,当多人开发或者JavaScript代码写的数量巨大时不用担心命名冲突的问题。我们也可以写一个命名空间的功能,省去以上复杂的声明方式。比如以上例子实际上我只是暂时用到config.admin.module.color.changeBgColor这个功能,那么我就需要先定义config,接着admin,然后module,最后是color.changeBgColor,比较繁琐,于是我们可以写一个命名空间注册的功能,直接注册就能用:

 代码如下 复制代码
// 命名空间注册函数
var namespace = {
    reg : function(s){
        var arr = s.split('.');
        var namespace = window;
 
        for(var i=0,k=arr.length;i<k;i++){
            if(typeof namespace[arr[i]] == 'undefined'){
                namespace[arr[i]] = {}; 
            }
 
            namespace = namespace[arr[i]];          
        }
    },
    del : function(s){
        var arr = s.split('.');
        var namespace = window;
 
        for(var i=0,k=arr.length;i<k;i++){
            if(typeof namespace[arr[i]] == 'undefined'){
                return;
            }else if( k == i+1 ){
                delete  namespace[arr[i]];
                return;
            }else{
                namespace = namespace[arr[i]];      
            }       
        }           
    }
};

可以这样注册命名空间

 代码如下 复制代码
// 先注册命名空间
namespace.reg('config.admin.module.color');
 
// 添加功能
config.admin.module.color.changeBgColor = function(color){
    document.body.style.background = color;
};
 
// 调用功能
config.admin.module.color.changeBgColor('#F30');
 
 
// 删除命名空间
namespace.del('config.admin.module.color');

命名空间没有唯一规则,只有根据每个项目以及项目负责人对程序的分析然后给出一定命名规则,比如有些项目根据功能命名空间,有些项目根据负责人名命名空间等等。但无论采用哪种方式,合理的命名空间在你应对大项目时多人合作时不会因为命名冲突而重构。因此你的站点中的js文件将有一篇是第一位引入的namespace.js,它定义了这个项目所有的命名空间与管理。

 

NamespaceObjectFactory:根据fqn生成NamespaceObject对象。
NamespaceObjectFactory对象只有一个create方法,参数就是命名空间的名字(Fully Qualified Name)。该方法有一个闭包环境,该环境里有一个cache变量用于缓存所有生成的NamespaceObject对象。
一个NamespaceObject对象包含有三个属性,stash(记录当前namespace),fqn(namespace名字),proc(createProcedure对象)。方法包括:enqueue,call,valueof,merge,getStash,getExport

 代码如下 复制代码


74 var NamespaceObject = function _Private_Class_Of_NamespaceObject(fqn){
75 merge(this, {
76 stash: { CURRENT_NAMESPACE : fqn },
77 fqn : fqn,
78 proc : createProcedure()
79 });
80 };
81 merge(NamespaceObject.prototype, {
82 enqueue: function(context) {
83 this.proc.next(context);
84 },
85 call: function(state,callback) {
86 this.proc.call(state, callback);
87 },
88 valueOf: function() {
89 return "#NamespaceObject<" + this.fqn + ">";
90 },
91 merge: function(obj) {
92 merge(this.stash,obj);
93 return this;
94 },
95 getStash: function() {
96 return this.stash;
97 },
98 getExport: function(importName) {
99 if (importName === '*') return this.stash;
100
101 var importNames = importName.split(/,/),
102 retStash = {};
103 for(var i = 0,l=importNames.length;i<l;i++){
104 retStash[ importNames[i] ] = this.stash[ importNames[i] ];
105 }
106 return retStash;
107 }
108 });
109 var NamespaceObjectFactory = (function() {
110 var cache = {};
111 return {
112 create :function(fqn){
113 _assertValidFQN(fqn);
114 return (cache[fqn] || (cache[fqn] = new NamespaceObject(fqn)));
115 }
116 };
117 })();

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论