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权威指南