首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议83:使用原型委托

关灯直达底部

任何一个对象都连接到一个原型对象,并且可以从中继承属性。通过对象字面量创建的对象都可以连接到Object.prototype这个基本原型对象,例如:


var obj={};

Object.prototype.name="prototype";

obj.name;//"prototype"


当然,在创建一个新对象时也可以选择某个对象作为它的原型。JavaScript提供的实现机制比较烦琐,不妨设计一个中间件,以简化这种操作:为Object对象增加一个create方法,由create方法创建一个使用参数对象作为其原型的新对象。


if(typeof Object.create!=='function'){

Object.create=function(o){

var F=function{};

F.prototype=o;

return new F;

};

};


在上面代码中先检测Object.create是否为Object对象的方法,如果不是,则添加该方法,在该方法内创建一个构造器,把参数对象作为原型传递给它,然后实例化构造器,最后将这个实例返回。

现在就可以定义两个对象obj1和obj2,借助Object.create这个中间件,把obj1作为prototype绑定到obj2上,此时就可以在obj2中继承obj1对象中的属性了。


var obj1={

name:"obj1"

}

var obj2=Object.create(obj1);

obj2.name;//"obj1"


原型连接在更新时是不起作用的。当改变某个对象属性值时,不会触及该对象的原型,例如:


obj2['first-name']='first';

obj2['middle-name']='middle';

obj2.name='More';


原型连接只有在检索值时才会用到。如果尝试去获取对象的某个属性值,并且该对象没有此属性名,那么JavaScript会试着从原型对象中获取属性值。如果原型对象也没有该属性,那么再从原型对象的原型中寻找,依此类推,直到该过程最后到达终点Object.prototype。如果想要的属性完全不存在于原型链中,那么最后结果将返回undefined值。这个检索的过程称为原型委托。

原型关系是一种动态的关系。如果添加一个新的属性到原型中,那么该属性会立即被所有基于该原型创建的对象继承。