第五章 对象创建模式
命名空间模式
通用命名空间函数
代码语言:javascript复制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 =1){
//如果它不存在,就创建一个属性
if(typeof parent[parts[i]]==="undefined"){
parent[parts[i]]={};
}
parent=parent[parts[i]];
}
return parent;
};
//将返回值非给一个局部变量
var module2=MYAPP.namespace('MYAPP.modules.module2');
module2===MYAPP.modules.module2 //true;
//忽略最前面的MYAPP
MYAPP.namespace("modules.module51");
//长命名空间
MYAPP.namespace("once.upon.a.time.there.was.this.long.nested.property");
声明依赖关系
这是一个及其简单的模式,但同时又很多优点,速度更快
代码语言:javascript复制var myFunction=function(){
//依赖
var event=YAHOO.util.Event,
dom=YAHOO.util.Dom;
//使用事件和DOM变量
代码语言:javascript复制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 =1){
//如果它不存在,就创建一个属性
if(typeof parent[parts[i]]==="undefined"){
parent[parts[i]]={};
}
parent=parent[parts[i]];
}
return parent;
};
var modules=MYAPP.namespace("MYAPP.modules");
modules.m1=function(){
alert('m1');
}
modules.m2=function(){
alert("m2");
}
function test(){
var modules=MYAPP.modules;
modules.m1();
modules.m2();
}
私有属性和方法
JavaScript中所有对象的成员都是公共的
代码语言:javascript复制var myobj={
myprop:1,
getProp:function(){
return this.myprop;
}
}
console.log(myobj.myprop); //myprop是公有可访问的
console.log(myobj.getProp()); //getProp也是公有可访问的
代码语言:javascript复制function Gadget(){
this.name="iPod";
this.stretch=function(){
return 'iPod';
};
}
var toy=new Gadget();
console.log(toy.name); //name 是公有的
console.log(toy.stretch()); //stretch()是公有的
私有成员
可以使用闭包实现私有成员
代码语言:javascript复制function Gadget(){
//私有成员
var name="iPod";
//公有函数
this.getName=function(){
return name;
};
}
var toy=new Gadget();
console.log(toy.name); //name 是undefined的 ,它是私有的
console.log(toy.getName()); //getName()是公有的 输出iPod
特权方法
Privileged Method ,在上面的例子中,getName()就是一个特权方法,因为它具有访问私有属性的特殊权限。