代码之家  ›  专栏  ›  技术社区  ›  CodyBugstein

在javascript中,为什么从构造函数返回函数会破坏对象?[副本]

  •  0
  • CodyBugstein  · 技术社区  · 5 年前

    当我从函数创建新对象时,使用 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??
    3 回复  |  直到 5 年前
        1
  •  4
  •   Fullstack Guy    5 年前

    来自MDN docs 对于 “新的” 操作员:

    如果构造函数没有显式返回对象,则 而是使用在步骤1中创建的对象。(通常构造函数不 返回一个值,但如果要重写,则可以选择这样做 正常的对象创建过程。)

    因此,在返回中显式返回一个函数对象,它将重写由 Car2 构造函数函数。

    返回的函数对象没有 brand 所以你得到了 undefined ,可以通过显式添加 品牌 返回的函数对象的属性:

    function Car2() {
        this.brand = "Honda"
        const func =  function(){
            console.log('TEST');
        }
        func.brand = "Toyota";
        return func;
    }
    var car2 = new Car2()
    console.log(car2.brand)
        2
  •  0
  •   chandanchaudhary    5 年前

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

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

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

        3
  •  0
  •   TedTran2019    5 年前

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

    var car2 = new Car2()
    console.log(car2.brand) // undefined
    
    car2() // TEST
    But if you do car2(), you console.log ('TEST')
    

    car2就是您返回的函数。