javascript原型和原型继承

每一个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 

 

你可能感兴趣的:(JavaScript)