构造函数继承的核心在于利用 call 或 apply 将父类构造函数的执行上下文绑定到子类实例上,从而实现属性的复用。具体做法是在子类的构造函数内部调用父类构造函数,并传入当前实例和参数,这样父类的私有属性就会成为子类实例的自有属性。需要注意的是,这种方式仅能继承实例属性,无法继承原型链上的方法。

构造函数继承如何传递参数?
在子类构造函数中调用父类构造函数时,可以通过 call 方法的剩余参数直接透传。例如,定义一个 Parent 类接收 name 参数,在 Child 构造函数中调用 Parent.call(this, name),即可让子类实例拥有对应的 name 属性。这种机制确保了每个子类实例都拥有独立的属性副本,避免了引用类型的共享问题。

function Parent(name) {
this.name = name;
}
function Child(name, age) {
Parent.call(this, name);
this.age = age;
}
const child = new Child('Alice', 10);
console.log(child.name); // 'Alice'
console.log(child.age); // 10为什么构造函数继承不能获取原型方法?
因为构造函数继承只是简单的函数调用,它只复制了父类构造函数内部的代码执行结果,并没有建立原型链的连接。父类原型对象上的方法(如 sayHello)不会自动出现在子类原型上。因此,子类实例无法访问这些方法,必须通过手动设置原型或使用组合继承等方式来补充原型链的继承。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

function Parent() {
this.name = 'Parent';
}
Parent.prototype.sayHi = function() {
return 'Hi';
};
function Child() {
Parent.call(this);
}
// 此时 Child.prototype 没有指向 Parent.prototype
// childInstance.sayHi 会报错
const child = new Child();
console.log(child.sayHi); // undefined基于 Child 实例的属性独立性有什么具体表现?
当使用构造函数继承时,每个子类实例都会独立拥有一份父类属性的副本。这意味着修改一个实例的属性不会影响其他实例。例如,如果父类属性是一个数组,两个不同的子类实例可以分别操作各自的数组而互不干扰。这是构造函数继承相比纯原型链继承的主要优势之一,它解决了引用类型属性共享的问题。

















