es6的extends不提供深度继承,实例属性逐个复制(引用类型为浅拷贝),方法和静态成员通过原型链或构造函数链继承;需深拷贝时须手动处理。

ES6 的 extends 本身不提供“深度继承”这个概念——它实现的是标准的、基于原型链的类继承,属性和方法的继承行为有明确区分:实例属性是**逐个复制**到子类实例上的,而方法(包括 getter/setter)和静态成员是通过**原型链或构造函数链**继承的。所谓“深度”,实际体现在属性初始化时对引用类型值的处理方式上。
实例属性靠复制,不是原型共享
子类实例上的 this.xxx 属性,无论原始类型还是引用类型,都是在 new 实例时由父类 constructor 执行并赋值到当前实例对象上的。这意味着:
- 每个子类实例都拥有自己独立的属性副本,不会意外共享父类实例的状态
- 原始值(如 number、string)直接拷贝
- 引用值(如对象、数组)默认是**浅拷贝**:只是复制了引用,而非深克隆整个结构
字面量对象属性会“看起来像深拷贝”
当父类 constructor 中用字面量直接定义对象,例如 this.config = { timeout: 5000, retries: 3 },每次 new 子类实例时,都会执行一次该语句,生成一个全新对象。所以不同实例的 config 引用互不相等,但内部嵌套对象仍属同一层级的浅拷贝——这容易被误认为“深拷贝”,其实只是每次新建。
验证方式:
console.log(child1.config === child2.config); // false<br>console.log(child1.config.retries === child2.config.retries); // true(原始值)<br>console.log(child1.config.opts === child2.config.opts); // false(若 opts 是字面量对象)
真正需要深度继承时得手动处理
如果业务要求子类实例必须拥有父类配置的完整深拷贝(比如避免修改影响其他实例),不能依赖 extends 自动完成,需主动干预:
- 在子类 constructor 中调用
super()后,用structuredClone()(现代环境)或JSON.parse(JSON.stringify())(简单场景)复制关键引用属性 - 封装可复用的初始化逻辑,例如父类提供
cloneConfig()方法返回深拷贝后的配置对象 - 避免在 constructor 中直接复用外部变量对象,防止多个实例意外共享同一引用
方法与静态成员走原型/构造器链,天然“深度可用”
这些内容不涉及复制,而是通过原型链查找或构造函数继承获得:
- 实例方法(
sayHello())存在于父类 prototype 上,子类实例可直接调用 - 静态方法(
create())存在于父类构造函数上,子类构造函数可直接继承调用 - getter/setter 同样通过原型链访问,支持重写 + super 调用组合使用











