对Javascript系列(47)的深刻理解:对象创建模式(第一部分)

介绍

本文主要介绍了创建对象的模式,使用各种技术可以大大避免错误或编写非常简洁的代码。

模式1:名称空间(命名空间)

名称空间可以减少全局命名的数量,以避免命名冲突或过度。

复制代码代码如下所示:

VaR的应用程序| | { } =;

app.modulea = app.modulea | | { };

app.modulea.submodule = app.modulea.submodule | | { };

app.modulea.submodule.methoda =函数(){

console.log(打印);

};

app.modulea.submodule.methodb =函数(){

console.log(打印B);

};



如果有很多层次结构,它将继续下去,这是一个混乱。名称空间模式是为了解决这个问题,我们来看看代码:

复制代码代码如下所示:

/ /不安全,可能会改写现有的MyApp对象

VaR MyApp = { };



如果(typeof MyApp =未定义){

VaR MyApp = { };

}

/更简洁的方式

VaR MyApp = MyApp | | { };

定义一般方法

myapp.namespace =功能(ns_string){

无功部分= ns_string.split(' '),

父为MyApp,

我;

如果默认 / /第一节点MyApp,是不容忽视的,如myapp.modulea

如果(部分{ 0 } = MyApp){

Parts = parts.slice (1);

}

为(i = 0;i < parts.length;i = 1){

如果属性不存在,则创建该属性。

如果(typeof母{ } } = {我部分未定义){

{ } } {我父母部分= { };

}

父=父{ { } };

}

回报父母;

};



调用代码,非常简单:

复制代码代码如下所示:

通过名称空间,可以将返回值分配给本地变量。

VAR模2 = myapp.namespace('myapp。模块。模块2);

console.log(模2 = MyApp.模块。模块2); / /真的

跳过 / / MyApp

MYAPP.namespace('modules。module51);

非常长的名称

MYAPP.namespace(天。对。a.time。那里。是的。长。嵌套属性。);



模式2:定义依赖项

有时,模块的模块或函数可以引用第三方的模块或工具。最好在一开始就定义这些依赖项,以便以后可以很容易地替换它们。

复制代码代码如下所示:

var =函数MyFunction(){()

依赖模块

事件= yahoo.util.event VaR,

DOM = yahoo.util.dom;

在代码后面使用本地变量、事件和DOM /其他函数

};



模式3:私有财产和私有方法

Javascript没有提供特定的语法来支持私有属性和私有方法,但是我们可以通过闭包实现它。代码如下:

复制代码代码如下所示:

函数小工具(){

私有对象

变量名= 'ipod;

/公共功能

this.getname =函数(){

返回的名称;

};

}

新玩具();

未定义名称,是私有的

console.log(玩具的名字); / /未定义

用于访问名称的公共方法

Console.log((玩具。getName)); / / iPod

VaR myobj时; / /通过自我强化功能分配myobj时

(函数(){())

/免费对象

变量名=我的,我的;

公众/部分,所以没有var

myobj时= { {

授权方法

getName:函数(){

返回的名称;

}

};

}();



模式4:启示模式

是一种关于隐藏模式的私有方法,以及深入理解Javascript系列(3):模块模式的综合分析。在模块模式中有点类似,但不返回,但在外部声明变量,然后在内部分配变量的方法给公众:

复制代码代码如下所示:

VaR MyArray;

(函数(){())

VaR时={ } 对象数组

object.prototype.tostring toString =;

功能ISArray(){

返回tostring.call(一)=时;

}

功能指标(草垛、针){

var I=0,

马克斯= haystack.length;

(为;i < max;i = 1){

如果(草堆{ } =针){

还我;

}

}

返回- 1;

}

以赋值方式,最重要的是隐藏的细节。

MyArray = { {

ISArray:ISArray,

指标:指标,

InArray:指数

};

}();

/ /测试代码

console.log(myarray.isarray({ 1, 2 }) / /真实);

console.log(myarray.isarray(0:{ 1 }) / /假);

console.log(myarray.indexof(

console.log(myarray.inarray(

myarray.indexof = null;

console.log(myarray.inarray(



模式5:链式模式

连锁模式允许你调用一个对象的连续,如obj.add(1)(2)。删除。删除(4)加(2)。思考的方式很简单,也就是说,回到原来的样子:

复制代码代码如下所示:

var obj = { {

值:1,

增量:函数(){

this.value = 1;

返回此;

},

添加:函数(v){

this.value = V;

返回此;

},

函数(){

console.log(的价值);

}

};

链接方法调用

obj.increment(增加)(3)(。喊); / / 5

也可以是一个调用

obj.increment();

Obj.add(3);

Obj.shout();



总结

本文是对象创建模型的上部,请期待明天的下一部分。