子类化Object与自定义包装函数时super()的行为解析
子类化Object时super(v)的底层逻辑
这是ES6类继承内置构造函数的特殊规则导致的:
- 直接调用
new Object(1)时,Object构造函数会识别原始值参数,返回对应的Number包装实例。但当它作为ES6类的基类被super()调用时,规则发生了变化:ES6类要求子类实例必须属于子类自身,因此调用super(v)时会强制创建一个属于子类C的普通Object实例,完全跳过Object对原始值的包装逻辑。最终new C(1)是个普通对象,和Number无继承关系,所以instanceof Number返回false。
自定义包装函数的差异
MyObject是普通函数,它的逻辑就是显式返回new Object(v)的结果。当class D继承它时:
- 调用
super(v)等价于执行MyObject(v),这个函数返回的是Number实例。 - 根据ES6类规则,如果父类构造函数返回一个对象,子类实例会直接复用这个对象,而不是生成新的子类实例。所以
new D(1)本质就是那个Number实例,因此instanceof Number返回true。
核心差异总结
- 子类化内置
Object:super()受ES6类内置约束,生成子类自身的普通对象,忽略Object的包装逻辑。 - 继承自定义包装函数:
super()只是执行普通函数,复用其返回的对象,完全遵循函数自身的返回逻辑。
内容的提问来源于stack exchange,提问作者jimo
相关产品推荐
相关产品推荐

