JavaScript构造函数返回值规则及运行结果相关疑问
核心原因是JavaScript中new关键字调用构造函数的返回规则
当你用new调用一个构造函数时,执行逻辑如下:
- 首先创建一个空的普通对象
- 将该对象的隐式原型指向构造函数的
prototype属性 - 将构造函数内部的
this绑定到这个新创建的对象上 - 执行构造函数内部的所有代码
- 最后一步判断返回值:如果构造函数主动返回了引用类型的值(对象、数组、函数等),则
new调用的结果直接返回这个主动返回的值;如果没有返回值,或者返回的是原始类型值,才会返回最开始创建的、绑定了this的那个对象。
对你的代码的具体解释
你给出的Car构造函数最后主动返回了{ make: 'Maserati' },这是一个引用类型的普通对象,所以const myCar = new Car()里的myCar就是这个被主动返回的普通对象,自然不是函数,不能用myCar()的形式调用。
此时console.log(myCar.make)的输出就是'Maserati',而不是你预想的'Lamborghini'。
你认知的误区修正
如果你想要拿到值为'Lamborghini'的make,只需要删掉构造函数里的return语句即可,此时new Car()会返回绑定了this的默认对象,make属性就是你赋值的'Lamborghini'。
如果不用new,直接调用Car(),此时函数的返回值就是{ make: 'Maserati' },这种情况下你写const res = Car(); console.log(res.make)才会输出'Maserati'。
内容的提问来源于stack exchange,提问作者arturasmckwcz
相关产品推荐
相关产品推荐

