引言:
在javascript中创建对象是很容易的,可以使用对象字面量或者构造函数或者object.creat.在接下来的介绍中,我们将越过这些方法去寻求一些其他的对象创建模式。
我们知道js是一种简洁明了的语言,他没有像其他语言所拥有的一些语法特征,比如命名空间,模块,包,私有属性等。那么我们又将如何通过一些模式去实现,替换那些语法特征呢?或者仅以不同于那些语法特征的方式来思考问题?
命名空间模式(namespace)
说白了,就是在应用程序或者库中创建一个全局对像,然后把所有功能添加到改全局对象中。
优点:减少程序中所需要的全局变量的数量,同时也有助于避免命名冲突或过长的名字前缀。
缺点:需要输入更多的字符,附加的前缀增加了需要下载的代码量;长嵌套的名字意味着更长的属性解析查询时间。
注意:在添加一个属性或者创建一个命名空间之前,最好是首先检查它是否已经存在。
命名空间函数的实现实例。它是非破坏行的,如果已经存在一个命名空间,则不会重新去创建它。 var MYAPP = MYAPP || {}; MYAPP.nameSpace = function(ns_string){ var parts = ns_string.split(","),parent = MYAPP,i; if(parts[0] === "MYAPP"){ parts = parts.slice[1]; } for(i = 0;i<parts.length;i++){ if(typeof(parent[parts[i]) === "undefined"){ parent[parts[i]] = {}; } parent = parent[parts[i]] } return parent; } eg:MYAPP.nameSpace(modules.module2) //MYAPP.modules.module2 = {};
声明依赖关系
在您的函数或者模块顶部声明代码所依赖的模块是一个非常好的主意。也就是创建一个局部变量并使其指向所需的模块。
优点:解析局部变量的速度要比解析全局变量要快;明确的表明了所依赖的模块 var myFunction = function(){ var event = MYAPP.util.Event, dom = MYAPP.until.Dom; }
私有属性和方法
什么叫私有的?怎么是实现私有的?在函数中将需要保持为私有属性的数据包起来,并确保他对函数说是局部变量,这意味着外部函数不能访问它。
特权方法就是指那些可以访问私有成员的公共方法的一个名称而已。
function Gadget(){ var name= "ipod"; this.getName = function(){ //特权方法 return name } }
对象字面量以及私有性
var myobj = (function(){ var name = "my,oh my"; return { getName:function(){ reurn name; } } }())
原型和私有性
Gadget.prototype = (function(){ var browser = "PP"; return { getBrowser:function(){ reutrn browser; } } }())
将私有方法揭示为公共方法
var myArray = (function(){ var astr = "[object Array]",toString = Object.prototype.toString; function isArray(a){ return toString.call(a) == astr } function indexof(){ ..... } return { isArray:isArray, indexof:indexof } }())
模块模式
模块模式是本书中迄今为止介绍过的多钟模式的组合,也就是下面模式的组合;
- 命名空间
- 声明依赖
- 及时函数
- 私有和特权成员
eg:MYAPP.nameSpace("untilties.Array"); MYAPP.untities.Array = (function(){ var uobj = MYAPP.uti.Event, dom = MYAPP.uti.dom,Constr; Constr = function(o){ this.eles = this.toArray(o) } return Constr; }())
静态成员
静态属性和方法就是从一个实例到另外个实例都不会发生改变的属性和方法
公有静态成员
var PP= function(){}; PP.isShiny = function(){ return "you bet" } 不需要创建实例,直接函数调用即可。
私有静态成员
以同一个构造函数创建的所有对象共享该成员;构造函数外部不可访问该成员 var PP = (fucntion(){ var counter= 0,NewPP; NewPP = function(){counter +=1}; NewPP.prototype.getLastId = function(){ return counter; } retrun NewPP; }()) var ihone = new PP() ihone.getLastId(); //1; var apple = newPP(); apple.getLastId(); //2;