如何理解JavaScript中用extends扩展普通函数及对应示例代码?
在JavaScript中用extends扩展普通函数的方法
JavaScript里的extends关键字不仅能用来扩展类,还可以扩展普通的构造函数——只要这个函数能作为构造器被new调用(或者本身能返回一个对象)。核心规则有两个:
- 子类的
constructor必须调用super(),否则会直接报错; super()会直接调用父级的普通函数,若父函数显式返回了一个对象,子类实例会被这个返回的对象覆盖。
代码执行逻辑拆解
先把目标代码贴出来:
function MyObject(v) { return new Object(v); } class D extends MyObject { constructor(v) { super(v); } } console.log(new D(1) instanceof Number); // true
一步步拆解执行逻辑:
- MyObject函数的特殊行为:它接收参数
v后,直接返回new Object(v)。这里要注意Object构造函数的特殊逻辑:当传入数字、字符串这类原始值时,它会返回对应原始类型的包装对象——比如new Object(1)等价于new Number(1),是一个Number类型的实例。 - 子类D的继承逻辑:
class D extends MyObject表示D继承自MyObject这个普通函数。D的构造函数里调用super(v),这一步相当于直接执行MyObject(v),并且会把MyObject的返回值作为子类实例的最终结果。 - new D(1)的执行流程:
- 用
new调用D时,触发D的构造函数; - 构造函数调用
super(1),执行MyObject(1),得到new Object(1)(也就是Number包装对象); - 因为MyObject显式返回了一个对象,这个对象会直接替代原本默认创建的D实例,成为
new D(1)的结果;
- 用
- instanceof判断的结果:既然
new D(1)最终得到的是Number包装对象,那么instanceof Number自然返回true。
内容的提问来源于stack exchange,提问作者desen zhao
相关产品推荐
相关产品推荐

