在Javascript中,为什么从构造函数返回函数会破坏对象?

当我使用new运算符从函数创建新对象时,会得到一个可以访问其属性的对象。

但是,如果我从构造函数返回一个函数,则该对象没有属性,并且在我尝试访问它们时返回未定义。为什么?

function Car1() {
  this.brand = "Honda"
}
var car1 = new Car1()
console.log(car1.brand) // "Honda" 

function Car2() {
  this.brand = "Honda"
  return function() {
    console.log('TEST');
  }
}
var car2 = new Car2()
console.log(car2.brand) // undefined. why??

yangleilgone 回答:在Javascript中,为什么从构造函数返回函数会破坏对象?

从MDN docs中获取“新” 运算符:

  

如果构造函数未明确返回对象,则   而是使用在步骤1中创建的对象。 (通常,构造函数不会   返回一个值,但是如果他们想覆盖它们,他们可以选择这样做   正常的对象创建过程。)

因此,您将在返回中显式返回一个函数对象,该对象将覆盖由Car2构造函数创建的对象的默认返回。

您要返回的函数对象中没有brand属性,因此您得到undefined,可以通过将brand属性显式添加到返回的函数中来进行检查对象:

function Car2() {
    this.brand = "Honda"
    const func =  function(){
        console.log('TEST');
    }
    func.brand = "Toyota";
    return func;
}
var car2 = new Car2()
console.log(car2.brand)

,

您正在返回一个函数,这就是原因。

var car2 = new Car2()
console.log(car2.brand) // undefined

car2() // TEST
But if you do car2(),you console.log ('TEST')

car2只是您返回的函数。

,

new关键字用于根据构造函数创建对象。当new与构造函数一起使用时,构造函数会隐式返回this上下文。

但是在第二个示例中,您从构造函数中显式返回了函数体,因此car2不包含Car2的实例,而是要返回的函数体。

返回的函数不包含品牌属性,因此值未定义。

本文链接:https://www.f2er.com/3168796.html

大家都在问