Blog Email GitHub

16 Apr 2011
JavaScript原型继承

以前对javascipt的原型也是很有了解的,很久以前发过一篇文章JavaScript原型继承,谈了自己对原型继承的了解。 但是了解归了解,自己还没有真正写过一个子类继承一个超类,如果你认为下面的代码是继承,那就错了,那叫做“扩展”。

// Returns true if the last character is c
String.prototype.endsWith = function(c) {
    return (c == this.charAt(this.length - 1))
}

看过上段代码的同学,相信在代码附近也看到了warning:反对使用自己的方法来扩展内建类型

在《Javascript权威指南》第五版一书中,列出了一个继承需要的步骤,或许读起来不是特别理解。那就从源头开始,看看为什么 继承一个父类需要什么步骤。我这里说的源头是”constructor”。

看看下段话,摘自《JavaScript权威指南》:

new操作符和构造函数,用来创建了一个新的对象,然后把构造函数作为这个对象的一个方法来调用。 除此之外,在创建这个空对象以后,new设置这个对象的原型。这个对象的原型就是构造函数的prototype 属性的值,并且这个prototype的初始化值是一个对象,只带有一个属性constructor,其值就是构造函数。

根据上面一段话,就可以将

var a = new A();

翻译成

var a = {}; A.call(a);
/* If A inherit from object, A.prototype = new Object(); A.prototype.consturctor = A; */
a.prototype = A.prototype;

那如果想写一个子类B继承父类A,需要的步骤跟上面很类似:

function B() {
    A.call(this);
    /* other initialize code */
}

B.prototype = new A();
B.prototype.constructor = B;

/* If need, delete some attribute you don't want to inherit */
delete B.prototype.xx;

References & Resources:

  • JavaScript权威指南