类式继承4——共享原型

不像前一种类式继承模式需要调用两次父构造函数,下面这种模式根本不会涉及到调用父构造函数的问题。

一般的经验是将可复用的成员放入原型中而不是this。从继承的角度来看,则是任何应该被继承的成员都应该放入原型中。这样你只需要设定子对象的原型和父对象的原型一样即可:

  1. function inherit(C, P) {
  2. C.prototype = P.prototype;
  3. }

这种模式的原型链很短并且查找很快,因为所有的对象实际上共享着同一个原型。但是这样也有弊端,那就是如果子对象或者在继承关系中的某个地方的任何一个子对象修改这个原型,将影响所有的继承关系中的父对象。(译注:指会影响到所有从这个原型中继承的对象所依赖的共享原型上的成员。)

如图6-7,子对象和父对象共享同一个原型,都可以访问say()方法。但是,子对象不继承name属性。

图6-7 (父子对象)共享原型时的关系

图6-7 (父子对象)共享原型时的关系