javascript构造函数继承需分两步:先用parent.call(this)继承实例属性,再用child.prototype=new parent()继承原型方法并修复constructor。

JavaScript 中构造函数配合原型链实现继承,核心是分两步走:用 构造函数调用 继承实例属性,再用 原型链连接 复用原型方法。两者缺一不可,单独用哪一种都有明显缺陷。
先在子构造函数里调用父构造函数
目的是让每个子类实例拥有独立的属性(比如 name、colors),避免引用类型共享问题:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Parent.call(this, ...args)或Parent.apply(this, args),把父类构造逻辑“借”过来执行一次 - 此时
this指向新建的子类实例,父类中赋给this的属性就直接挂到该实例上 - 支持传参,比如
function Child(name, age) { Parent.call(this, name); this.age = age; }
再把子类原型指向父类实例
目的是让子类实例能访问父类原型上的方法(比如 sayName()):
- 写法是
Child.prototype = new Parent();—— 这样子类原型链就接上了父类原型 - 必须紧接着修复构造器:
Child.prototype.constructor = Child;,否则new Child()实例的constructor会指向Parent - 注意:这一步不能在子构造函数内部做,必须在函数定义之后、实例化之前完成
组合后的典型结构
完整写法示例如下:
function Parent(name) {this.name = name;
this.colors = ['red'];
}
Parent.prototype.sayName = function() { return this.name; };
function Child(name, age) {
Parent.call(this, name); // 继承实例属性
this.age = age;
}
Child.prototype = new Parent(); // 继承原型方法
Child.prototype.constructor = Child; // 修复 constructor
Child.prototype.sayAge = function() { return this.age; }; // 自己新增方法
要注意的常见陷阱
- 父类构造函数会被执行两次:一次在
Parent.call(),一次在new Parent()创建原型时。若父构造函数有副作用(如发请求、改全局状态),需谨慎 - 不要直接赋值
Child.prototype = Parent.prototype,否则修改子类原型会污染父类 - 新增子类方法一定要写在设置原型之后,否则会被覆盖
- ES6 的
class和extends底层仍是这套机制,super()就相当于Parent.call(this, ...)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










