借用构造函数继承中,this 的关键作用是让子类构造函数内部的 this 指向新创建的子类实例,从而确保父类构造函数中的属性被正确添加到该实例上;需用 call/apply 显式绑定 this,否则父类属性会赋值给全局对象或 undefined,导致继承失效。

在借用构造函数继承(也叫“经典继承”或“伪造继承”)中,this 的关键作用是**让子类构造函数内部的 this 指向新创建的子类实例**,从而确保父类构造函数中的属性(如 this.name、this.age)被正确添加到该实例上,而不是挂载到父类原型或全局对象。
为什么需要显式绑定 this?
父类构造函数本身并不知道它会被谁调用。如果不控制 this,直接 Parent() 调用会导致:
-
this指向全局对象(非严格模式)或undefined(严格模式),属性被错误赋值; - 无法将属性写入目标子类实例;
- 继承失效,子实例没有父类定义的实例属性。
核心做法:用 call 或 apply 显式指定 this
在子类构造函数中,通过 Parent.call(this, ...args) 把父类构造函数“借来”,并强制让其中的 this 指向当前正在构建的子类实例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function Parent(name, age) {
this.name = name;
this.age = age;
}
function Child(name, age, grade) {
// 关键:用 call 将 Parent 内部的 this 绑定到 new Child() 创建的实例
Parent.call(this, name, age);
this.grade = grade;
}
const c = new Child('Alice', 10, '5th');
console.log(c.name); // 'Alice' ✅
console.log(c.age); // 10 ✅
console.log(c.grade); // '5th' ✅
注意 this 的实际指向时机
this 在 Parent.call(this, ...) 这一刻才被确定——它就是 new Child() 返回的那个空对象。此时父类构造函数体执行,所有 this.xxx = ... 都直接写入该对象。这和“先 new Parent() 再复制属性”有本质区别:前者是**运行时动态注入**,后者是静态拷贝,且无法处理闭包或方法中的 this 绑定问题。
常见误区与补充说明
- 不能只写
Parent(...):缺少this绑定,属性会丢失或污染全局; - 不推荐用
new Parent(...)然后浅拷贝:会执行父类原型链上的代码(可能含副作用),且浪费内存创建无用父实例; - 若父类构造函数依赖
this.constructor,需注意子类实例的constructor仍指向Child,不是Parent(这是正常行为); - 此方式只继承实例属性,不继承原型方法;如需方法继承,需额外设置
Child.prototype = Object.create(Parent.prototype)并修正 constructor。
借用构造函数的本质,就是靠 call/apply 精准操控 this 的指向,把父类初始化逻辑“重放”在子实例身上。只要 this 绑定准确,属性传递就自然成立。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










