深入理解JavaScript系列(48):对象创建模式(下篇)
介绍
本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码。
模式6:函数语法糖
函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用prototype的特性,代码比较简单,我们先来看一下实现代码:
if(typeofFunction.prototype.method!=="function"){
Function.prototype.method=function(name,implementation){
this.prototype[name]=implementation;
returnthis;
};
}
扩展对象的时候,可以这么用:
varPerson=function(name){
this.name=name;
}
.method('getName',
function(){
returnthis.name;
})
.method('setName',function(name){
this.name=name;
returnthis;
});
这样就给Person函数添加了getName和setName这2个方法,接下来我们来验证一下结果:
vara=newPerson('Adam');
console.log(a.getName());//'Adam'
console.log(a.setName('Eve').getName());//'Eve'
模式7:对象常量
对象常量是在一个对象提供set,get,ifDefined各种方法的体现,而且对于set的方法只会保留最先设置的对象,后期再设置都是无效的,已达到别人无法重载的目的。实现代码如下:
varconstant=(function(){
varconstants={},
ownProp=Object.prototype.hasOwnProperty,
//只允许设置这三种类型的值
allowed={
string:1,
number:1,
boolean:1
},
prefix=(Math.random()+"_").slice(2);
return{ //设置名称为name的属性 set:function(name,value){ if(this.isDefined(name)){ returnfalse; } if(!ownProp.call(allowed,typeofvalue)){ returnfalse; } constants[prefix+name]=value; returntrue; }, //判断是否存在名称为name的属性 isDefined:function(name){ returnownProp.call(constants,prefix+name); }, //获取名称为name的属性 get:function(name){ if(this.isDefined(name)){ returnconstants[prefix+name]; } returnnull; } }; }());