介绍 本文主要是关于创作对象的下一部分。通过各种技巧,我们可以避免
错误或编写非常精简的代码。
模式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编程中
经常使用的对象创建模式。不同的场景扮演不同的角色。我们希望你能根据他们的需要选择合适的模式。