JavaScript中基类构造函数的this为何在派生类调用super后指向派生类?
原理说明
这是ES6类继承规范定义的标准行为,不属于调试器异常:
- 调用
new Derived()时,JS引擎会先创建实例对象,该对象的内置原型[[Prototype]]直接指向Derived.prototype,本质上已经是Derived类的实例。 - 派生类构造函数中执行的
super(),作用是把已经创建好的Derived实例作为this传入父类Base的构造函数,执行父类定义的初始化逻辑。因此你在Base构造函数的断点处看到的this就是Derived实例,完全符合设计预期。 - 直接调用
new Base()时,引擎创建的实例的[[Prototype]]指向Base.prototype,所以this是Base类的实例,和前者的实例创建上下文完全不同。
你可以通过修改代码直接验证该逻辑:
class Base { constructor() { console.log(this instanceof Derived); // 执行new Derived()时会输出true console.log(this); /*break point here in chrome debugger*/ } } class Derived extends Base { constructor() { super(); } }
补充说明:ES6类继承和ES5手写原型继承的逻辑正好相反:ES5是先创建父类实例,再把原型挂载到子类上;ES6是先创建子类实例,再把实例传给父类构造函数做初始化,这也是为什么派生类构造函数必须先调用super()才能访问this的原因。
内容的提问来源于stack exchange,提问作者Snm Jpa
相关产品推荐
相关产品推荐

