任何一个对象都连接到一个原型对象,并且可以从中继承属性。通过对象字面量创建的对象都可以连接到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值。这个检索的过程称为原型委托。
原型关系是一种动态的关系。如果添加一个新的属性到原型中,那么该属性会立即被所有基于该原型创建的对象继承。