ES5 的继承最优解

摘录自javascript高级程序设计第三版第六章,6.3继承。

需要继承来自于超类的属性(考虑到有引用类型,如数组不希望被共用),和来自于超类原型的方法(考虑到多个对象使用同一个方法能节省内存开销),这就得使用借用构造模式(SubType.prototype = new SuperType())来继承超类原型的方法,并且子类构造函数中使用原型链模式(SuperType.call(this, name))来继承超类的属性。

寄生组合式继承

//先创建一个超类原型的副本
//为创建的副本添加constructor指针
//将创建的对象副本赋值给子类
//这就完成了继承超类方法与属性的目的,而且不用一次次调用超类的构造函数
function inheritPrototype (SubType, SuperType) {
    var prototype = Object.create(SuperType.prototype); //创建对象
    prototype.constructor = SubType; //增强对象
    SubType.prototype = prototype; //指定对象
}

function SuperType (name) {
    this.name = name;
    this.array = [1, 2, 3];
}
SuperType.prototype.sayName = function () {
    alert(this.name);
}


function SubType (name, age) {
    //继承超类属性
    SuperType.call(this, name);
    this.age = age;
}

//继承超类方法
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function () {
    alert(this.age);
};
var instance1 = new SubType('Nicholas', 29);
var instance2 = new SubType('Greg', 27);
instance1.array.push(4); //[1, 2, 3, 4]
instance2.array; //[1, 2, 3]
instance1.name; //"Nicholas"
instance2.name; //"Greg"
instance1.sayAge; //29
instance2.sayAge; //27

这个模式的高效之处就在于只会调用一次超类的构造函数,避免了在子类上一遍遍创建超类原型上多余的属性。与此同时,原型链还能保持不变,是开发人员普遍认为的最理想继承模式。

posted @ 2020-03-15 20:41  Ever-Lose  阅读(140)  评论(0编辑  收藏  举报