每一个javascript对象(null除外)都和原型对象相关联,每一个对象都从原型对象继承属性。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过javascript代码Object.prototype获得对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。因此,同使用{}创建对象一样,通过new Object()创建的对象也继承自Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是Date.prototype。
首先,我们来了解一下Object.create方法。
ECMAScript5定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数是这个对象的原型,第二个参数用以对对象的属性进行进一步描述。使用它很简单,直接传入所需的原型对象即可。
例如:
var o1 = Object.create({a:1, b:2}); //o1继承了属性x和y
var o2 = {x:10, y:20};
var o3 = Object.create(o2); //o3继承了o2
如果想创建一个普通的空对象(比如通过{}或者new Object()创建的对象),需要传入Object.prototype,例如:
var o4 = Object.create(Object.prototype); //o4跟{}和new Object()一样
使用Object.create方法可以通过任意原型对象创建新对象,也即可以使任意对象可继承。因此,我们可以写一个原型继承函数,如下:
function inherit(p){
if(Object.create){
return Object.create(p);
}else{
function f(){}
f.prototype = p;
return new f();
}
}
接着,我们来看看javascript对象的继承。
javascript对象具有"自有属性",也有一些属性是从原型对象继承而来的。假设要查询对象o的属性x,如果o中不存在x,那么将会继续在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型也有原型,那么继续在这个原型对象的原型上执行查询,知道找到x或者查找到一个原型是null的对象为止。可以看到,对象的原型属性构成了一个"链",通过这个"链"可以实现属性的继承。
例如:
var o = {}; //o从Object.prototype继承对象的方法
o.x = 1;
var p = inherit(o); //p继承o和Object.prototype
p.y = 2;
var q = inherit(p); //q继承p、o和Object.Prototype
q.z = 3;
q.x + q.y //3:x和y分别继承自o和p