命名空间:
- 优点:可以解决命名混乱和第三方冲突;
- 缺点:长嵌套导致更长的查询时间;更多的字符;
- 通用命名空间函数:
var MYAPP = MYAPP || {}; MYAPP.namespace = function (ns_string) { var parts = ns_string.split('.'); parent = MYAPP; if(parts[0] === 'MYAPP') { parts = parts.slice(1); } for(var i = 0; i < parts.length; i++) { if(typeof parent[parts[i]] === 'undefined') { parent[parts[i]] = {}; } parent = parent[parts[i]]; } return parent; } var module2 = MYAPP.namespace('MYAPP.modules.module2');
声明依赖关系:虽然已经进行了模块化命名,但再声明依赖能更优化
如对于:MYAPP, MYAPP.util.Event, MYAPP.util.Dom; //在一个函数或模块顶部进行声明 var myFunc = function() { var event = MYAPP.util.Event; var dom = MYAPP.util.Dom; ................ }
解析局部变量的速度比解析全局变量快;
私有属性:
- 私有属性和特权方法:构造函数方法
function Gadget() { var name = 'iPod'; this.getName = function () { return name; } }
注意,如果私有属性设置是一个对象,且只读,那么不要将它直接返回,而是返回其浅复制后的副本;
- 私有属性:对象/匿名即时调用函数
var myobj = (function () { var name = 'my'; return { getName: function () { return name; } } }()); myobj.getName();
- 私有属性:原型 如果是所有创建对象都需要的私有属性,可以设置到原型中
Gadget.prototype = (function () { var browser = 'Mobile Webkit'; return { getBrowser: function () { return browser; } } })
模块模式:
- 组合:
- 命名空间
- 即时函数
- 私有和特权成员
- 声明依赖
- 例子
var MYAPP = {}; MYAPP.namespace = function (ns_string) { var parts = ns_string.split('.'); parent = MYAPP; if(parts[0] === 'MYAPP') { parts = parts.slice(1); } for(var i = 0; i < parts.length; i++) { if(typeof parent[parts[i]] === 'undefined') { parent[parts[i]] = {}; } parent = parent[parts[i]]; } return parent; }; MYAPP.namespace('MYAPP.utilities.array'); MYAPP.utilities.array = (function () { //依赖 var uobj = MYAPP.utilities.object, ulang = MYAPP.utilities.lang, //私有属性 array_string= '[object Array]', ops = Object.prototype.toString, //... //私有方法 inArray = function (needle, haystack) { for(var i = 0, max = haystack.length; i < max; i++) { if(haystack[i] === needle) { return true; } } }, isArray = function (a) { return ops.call(a) === array_string; }; //可选的一次性初始化过程 //公有API return { inArray:inArray, isArray:isArray, //... } })();
- 例子:使用构造函数
MYAPP.namespace('MYAPP.utilities.Array'); MYAPP.utilities.Array = (function () { //依赖 var uobj = MYAPP.utilities.object, ulang = MYAPP.utilities.lang, //私有属性和方法 Constr; //可选的一次性初始化过程 //.... //公有API-构造函数 Constr = function(o) { this.elements = this.toArray(o); }; //公有API-原型 Constr.prototype = { constructor: MYAPP.utilities.Array, version: '2.0', toArray: function (obj) { for (var i = 0, a = [], len = obj.length; i < len; i++) { a[i] = obj[i]; } return a; } } //返回要配置给新空间的构造函数 return Constr; })(); var arr = new MYAPP.utilities.Array(['a','b']);
- 将全局变量导入模块中
MYAPP.utilities.module = (function (app, global) {})(MYAPP, this);