首页 > js 组合式继承

js 组合式继承

function extend (superClass, subClass) {
    subClass.prototype = new superClass();
    subClass.constructor = subClass;
}
function Person (name) {
    this.name = name;
    this.color = ['red', 'blue'];
}
Person.prototype.sayName = function () {
    console.log(this.name);
}
function Student (name) {
    Person.call(this, name);
}

var per = new Person('person');
extend(Person, Student);
var stu1 = new Student('stu1');
var stu2 = new Student('stu2');
stu1.color.push('green');
stu1.sayName();
stu2.sayName();
console.log(stu1.color); // ['red', 'blue', 'green']
console.log(stu1.color); // ['red', 'blue', 'green']
console.log(per.color); // ['red', 'blue']

以上代码为组合式继承,看了《高级程序设计》说简单的原型链继承的弊端在引用类型的原型属性被多个实例共享以及不能在不影响其他实例的情况下为父类构造函数提供参数;简单的借用构造函数方式的弊端在于不能继承原型的属性。因为提出了组合式方式继承。可是这种方式虽然规避了借用构造函数继承的缺点和解决了原型链继承的不能为父构造函数提供参数的缺点,可是引用类型原型属性仍然被所有实例所共享,以上代码中stu1修改color仍然会影响到stu2.
请问组合式继承还在存在引用类型原型属性所有实例共享这个缺点是吧?


我在知乎上找到了答案,非常感谢知友的回答。不活跃呢。
以上代码有2处错误:
1.在重写子类原型过后更新constructor出错,应该修改的是子类的原型,这样构造函数才会正确
2.应该调用stu2.getColor函数,并非stu1的,这属于低级错误,大脑短路了。哎

【热门文章】
【热门文章】