ES5与ES6继承本质不同:ES5先创建子类实例再补父类属性,ES6必须先调super()创建父类实例;ES5需手动设置原型链和constructor,ES6自动完成;ES6方法不可枚举、constructor自动维护、可安全继承内置类。

ES5 和 ES6 的继承看似目标一致,但底层执行顺序、this 创建时机和原型链建立方式有本质区别,不是简单“语法糖”能概括的。
实例对象的创建时机完全不同
ES5 是「先造子类实例,再补父类属性」:子类构造函数内部用 Parent.call(this) 把父类实例属性挂到已存在的 this 上;this 由 new 操作符直接创建,与父类无关。
ES6 是「先造父类实例,再交给子类加工」:子类构造函数中必须先调用 super(),此时引擎会先创建父类的完整实例(包括初始化父类的 this),然后把这个 this 交给子类继续添加属性。不调 super() 就没有 this,直接报错。
原型链的建立路径不同
ES5 中需手动设置:Child.prototype = Object.create(Parent.prototype),再修正 constructor 指向,否则 new Child().constructor 会错误指向 Parent。
ES6 中 extends 自动完成两件事:
- 让 Child.prototype.__proto__ === Parent.prototype(方法继承)
- 让 Child.__proto__ === Parent(静态方法继承)
这两条链是独立建立、同时生效的,不需要手动干预。
方法枚举性与 constructor 行为差异
ES5 在原型上定义的方法默认可被 for...in 遍历;ES6 类中定义的实例方法不可枚举,更符合传统类语义。
ES5 子类原型的 constructor 必须显式重置,否则丢失;ES6 中 class Child extends Parent 会自动维护正确的 constructor 指向,无需额外操作。
对内置类的支持能力不同
ES5 无法安全继承 Array、Error 等内置构造函数——new Parent() 或 Object.create(Parent.prototype) 都不能正确复现其内部状态。
ES6 的 extends 被引擎特别支持,允许 class MyArray extends Array,且 new MyArray().length、instanceof Array 全部正常工作,这是底层机制级的增强。











