- 刚开始我考虑共享原型的方式实现继承, 思路和代码如下
function Father() {}
function Son() {}
function inherit(Target, Origin) {
Target.prototype = Origin.prototype;
}
inherit(Son, Father);
- 但是由于共享原型的继承方式无法实现原型Son既继承原型Father的属性又同时拥有自己的独有属性 , 于是我考虑将子类的独有属性添加在一个在原型链上的对象身上, 所以考虑出如下方式实现继承
function Father() {}
function Son() {}
function inherit(Target, Origin) {
Target.prototype = new Origin();
}
inherit(Son, Father);
-
后经如下测试发现, 这种继承方式, 子类实例会共享父类构造函数的属性, 而非子类实例私有
Father.prototype.lastName = 'liu'; function Father() { this.name = 'father'; this.hobby = ['swim', 'ball']; } Son.prototype = new Father(); function Son() { this.name = 'son'; } var tom = new Son(); var bob = new Son(); tom.hobby.push('sing'); console.log(bob.hobby); // [ 'swim', 'ball', 'sing' ]
-
圣杯模式实现的继承方式如下
-
通俗写法
function inherit(Target, Origin) { var F = function () {} F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.constructor = Target; Target.prototype.uber = Origin.prototype; }
-
雅虎写法 , 结合闭包 , 将中间函数F私有化
var inherit = (function () { var F = function () {} return function(Target, Origin) { F.prototype = Origin.prototype; Target.prototype = new F(); Target.prototype.constructor = Target; Target.prototype.uber = Origin.prototype; } }())