javascript构造函数继承需用call/apply调用父类构造函数并绑定this,使父类this属性复制到子实例自身,实现属性独立;仅继承构造函数内this属性,不继承原型方法。

JavaScript 构造函数继承父级构造函数的属性,核心是用 call 或 apply 在子类构造函数中调用父类构造函数,并把 this 绑定到当前子类实例上。这样父类中所有挂载在 this 上的属性(包括基本类型和引用类型),都会被“复制”到子类实例自身,实现独立拥有、互不干扰。
为什么必须用 call/apply?
因为父类构造函数内部的 this 指向决定了属性挂载位置。直接调用 Parent() 会让属性挂到全局(如 window);而 Parent.call(this, ...) 确保属性写入当前子类实例,比如:
-
this.name = name→ 子实例自有name -
this.colors = ['red', 'blue']→ 每个子实例都有一份独立数组
如何正确传递参数?
子类构造函数接收参数后,原样传给父类构造函数即可,支持任意数量和类型:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Parent.call(this, name, age)-
Parent.apply(this, arguments)(适合参数不确定时) - 也可做预处理:
Parent.call(this, name + '_child', Math.max(age, 0))
注意:只继承 this 上的属性,不继承原型方法
这种方式只能拿到父类构造函数体内赋值的属性(this.xxx),但拿不到定义在 Parent.prototype 上的方法,例如:
- ✅ 继承了:
this.name、this.colors - ❌ 不继承:
Parent.prototype.sayName(需额外通过原型链补上)
常见错误写法
以下写法无法真正继承属性:
-
Parent(name)——this指向全局,属性污染全局环境 -
new Parent(name)—— 创建了无关的父类实例,属性没挂到子实例上 -
Child.prototype = new Parent()—— 这是原型链继承,不是构造函数继承,会导致引用属性共享
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










