对Javascript系列(48)的深入理解:对象创建模式(下一部分)

对Javascript系列(48)的深入理解:对象创建模式(下一部分)
介绍

本文主要是关于创作对象的下一部分。通过各种技巧,我们可以避免错误或编写非常精简的代码。

模式6:函数语法糖

函数语法是快速将方法(函数)添加到对象的扩展。这主要是基于原型的特点,代码比较简单。让我们先看看实现代码。

复制代码代码如下所示:

如果(typeof function.prototype.method!=函数){

function.prototype.method =函数(名称、执行){

这是原型{名称}实现;

返回此;

};

}
当对象被扩展时,可以使用如下:

复制代码代码如下所示:

var =函数(名称){

this.name =名称;

}

方法('getname,

函数(){

返回this.name;

})

方法('setname功能(name){

this.name =名称;

返回此;

});
这给人的功能添加getName和setName方法2,然后我们将验证结果:

复制代码代码如下所示:

创建一个新的人('adam);

Console.log((a.getname)); / / 'adam

console.log(a.setname)('eve)(。getName); / / 'eve
模式7:对象常量

对象常是提供各种方式的体现,得到ifdefined为对象,建立的方法只保留对象被第一集,后来复位无效,已达到无人能超负荷的目的。实现代码如下:

复制代码代码如下所示:

var常量=(函数(){())

常量常量= },

ownprop = object.prototype.hasownproperty,

设置只允许三种类型的值。

允许= {

字符串:1,

编号:1,

布尔:1

},

前缀=(数学。随机)+_ (切)(2);

返回{

/设置具有name名称的属性

集合:函数(name,value){

如果(this.isdefined(名字)){

返回false;

}

如果(!ownprop.call(允许类型的值)){

返回false;

}

常量{前缀+名称} =值;

返回true;

},

/以确定是否有名为name的属性。

定义:函数(名){

返回ownprop.call(常量前缀+姓名);

},

获取具有名称的属性

获取:函数(名称){

如果(this.isdefined(名字)){

返回常量{前缀+名称};

}

返回null;

}

};

}();
验证代码如下所示:

复制代码代码如下所示:

检查

console.log(constant.isdefined(最大)); / /假

定义

console.log(constant.set(最大,480)); / /真的

重新检测

console.log(constant.isdefined(最大)); / /真的

尝试重新定义

console.log(constant.set(最大,320)); / /假

确定原始定义是否仍然存在

console.log(constant.get(最大); / / 480)
模式8:沙箱模型

沙箱(沙箱)模式为即时的一个或多个模块提供单独的上下文,而不影响其他模块的上下文,如事件、3种方法沙箱、DOM、ajax,其中2个调用由一个环境组成,而调用三个组成的环境则不受干扰:

复制代码代码如下所示:

函数沙箱(){

数组的参数

var args = array.prototype.slice.call(参数),

最后一个参数是回调

args.pop回调=(),

除了最后一个参数,另一个是选择模块。

模块(args { 0 } =类型参数{ 0 } =字符串)参数:参数{ 0 },

我;

使用新操作符的强制用法

如果(!(这是沙箱)){

返回新的沙箱(模块,回调);

}

添加属性

这个= 1;

b = 2;

对这个对象需要添加模块

如果没有的模块或参数

如果(模块| |!{

模块= };

对于(我在沙箱模块){

如果(sandbox.modules.hasownproperty(I)){

Modules.push(我);

}

}

}

初始化所需的模块

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

沙箱模块{ { } }(这个);

}

调用回调

回调(此);

}

添加默认原型对象

sandbox.prototype = { {

名称:我的应用程序

版本:1

getName:函数(){

返回this.name;

}

};
然后我们重新定义默认初始模块:

复制代码代码如下所示:

sandbox.modules = { };

sandbox.modules.dom =功能(箱){

box.getelement =函数(){

};

box.getstyle =函数(){

};

box.foo =酒吧;

};

sandbox.modules.event =功能(箱){

如果需要,访问沙箱原型:



box.attachevent =函数(){

};

box.detachevent =函数(){

};

};

sandbox.modules.ajax =功能(箱){

box.makerequest =函数(){

};

box.getresponse =函数(){

};

};
打电话的方式如下:

复制代码代码如下所示:

调用

沙盒({ 'ajax ','event},功能(箱){)

console.log(typeof(盒。Foo));

DOM / /没有选择,所以box.foo不存在

});

沙盒('ajax ','dom功能(箱){)

console.log(typeof(盒。attachevent));

没有选择 / /事件,所以attachevent事件定义不存在

});

(函数*(方框){

console.log(箱); / /所有上述定义访问方法

});
通过三种不同的调用方式,我们可以看出三种方式的上下文是不同的。在第一种方式不富,但有二没有attachevent,因为只加载Ajax和DOM事件,但没有加载,加载和第三。

模式9:静态成员

静态成员(静态成员)是由函数或对象提供的静态属性。它可以分为私人的和公共的,就像C #或java公共静态和静态。

让我们先看看公众成员。公众成员很简单。我们通常声明函数是公共的,例如:

复制代码代码如下所示:

构造函数

var =函数(){()

};

/公共静态方法

(gadget.isshiny =功能){

返回你敢打赌;

};

原型的常规方法添加

gadget.prototype.setprice =功能(价格){

this.price =价格;

};

调用静态方法

Console.log((小工具。isshiny)); / / 你打赌

创建实例,然后调用方法

新设备();

(500)iphone.setprice;

console.log(typeof的小工具。setprice); / / 的定义

console.log(typeof的iPhone。isshiny); / / 的定义

gadget.prototype.isshiny = gadget.isshiny;

Console.log((iPhone。isshiny)); / / 你打赌
和私有静态成员,我们可以使用它们的闭包来实现,下面是两个实现。

第一种实现方式:

复制代码代码如下所示:

var =(函数(){())

静态变量/属性

var计数器= 0;

闭包构造函数的一个新实现返回

返回函数(){

console.log(反= 1);

};

}());立即执行

var =新的(小工具);1

var =新的(小工具);2

var =新的(小工具);3
如您所见,虽然每次都是新对象,但数量仍在增加,达到静态成员的目的。

第二方式:

复制代码代码如下所示:

var =(函数(){())

静态变量/属性

var计数器= 0,

newgadget;

新构造函数的实现

(newgadget =功能){

计数器=1;

};

授权访问方法

(newgadget.prototype.getlastid =功能){

返回柜台;

};

覆盖/构造函数

返回newgadget;

}());立即执行

新设备();

Iphone.getLastId(1); / /

新设备();

Ipod.getLastId(2); / /

新设备();

Ipad.getLastId(3); / /
该数字也在增加,这是使用其内部授权方法的闭包特性实现的。

总结

这是对象创建模式的下一部分。21种模式和9种模式是我们日常Javascript编程中经常使用的对象创建模式。不同的场景扮演不同的角色。我们希望你能根据他们的需要选择合适的模式。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部