【问题标题】:In Javascript, why does returning a function from a constructor function ruin the object? [duplicate]在 Javascript 中,为什么从构造函数返回函数会破坏对象? [复制]
【发布时间】:2020-02-29 10:42:33
【问题描述】:

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

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

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??

【问题讨论】:

  • 如果在函数结束时返回其他对象,则会覆盖原来的新对象内容。因为您正在传回新功能
  • 我不会返回另一个对象。但我正在返回一个函数
  • 因为您将属性 brand 添加到了一个对象,而 return 添加了另一个对象。 “我没有返回另一个对象。但我正在返回一个函数” 函数是对象。在控制台中检查someFunction instanceof Object
  • typeof(car1) === 'object' typeof(car2) === 'function' car1 instanceof Object === true car2 instanceof Object === true 最后一个意味着您可以将 car2 作为普通对象访问,尽管它实际上是派生函数。

标签: javascript constructor scope closures


【解决方案1】:

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

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

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

car2 就是你返回的函数。

【讨论】:

  • 是的,但是brand 属性发生了什么事?
  • 它在原始对象上,即 Car2 的构造函数。但是你返回了一个匿名函数,它没有品牌属性
【解决方案2】:

来自MDN docs “new” 运算符:

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

因此,您在 return 中显式返回了一个函数对象,它覆盖了由 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)

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2013-12-08
      • 2021-01-04
      相关资源
      最近更新 更多