寄生组合继承的核心实现方式是什么
寄生组合继承通过object.create()建立原型链并配合构造函数.call()绑定实例属性,解决了传统组合继承调用两次父类构造函数的性能损耗问题。具体做法是先定义一个辅助函数inheritprototype,内部使用object.create(super.prototype)创建中间对象并修正constructor指向,再将这个中间对象赋值给sub.prototype,最后在sub构造函数中调用super.call(this, ...args)完成属性拷贝。

如何编写通用的继承工具函数
编写通用工具函数需要封装原型链设置和构造函数调用两个步骤,确保子类能正确访问父类方法且拥有独立的实例属性。核心逻辑是创建一个不执行父类构造函数的原型对象,将其作为子类的原型,从而切断对父类实例的依赖,仅保留对原型的引用。

function inheritPrototype(subType, superType) {
var prototype = Object.create(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
function SuperType(name) {
this.name = name;
this.colors = ["red", "blue"];
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function() {
console.log(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("green");
console.log(instance1.colors); // "red,blue,green"
var instance2 = new SubType("Greg", 27);
console.log(instance2.colors); // "red,blue"
实例属性隔离与原型共享的具体表现
在寄生组合继承中,每个子类实例拥有独立的引用类型属性如数组或对象,而方法则共享在原型上以实现内存优化。当修改一个实例的colors数组时,不会影响其他实例,因为属性是在构造函数调用时通过call绑定到this上的;而sayName方法由于位于SuperType.prototype且被SubType.prototype继承,所有实例共享同一份函数引用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











