gpt4 book ai didi

javascript - 使用 'return' 创建对象时使用 'new'

转载 作者:IT老高 更新时间:2023-10-28 23:20:36 25 4
gpt4 key购买 nike

我今天发现了一件很奇怪的事情:如果您使用构造函数和 new 关键字创建对象,但 return 从构造函数中返回一个函数,它的行为如下:

  1. 新创建的“对象”是一个函数。
  2. 这个新函数可以像平常一样被调用,但是......
  3. 如果您在构造函数中维护对 this 的引用,则 this 将引用从构造函数正确创建的对象。这是您期望从 new 返回的内容。

这是一个例子:

function Constructor() {
var self = this;

this.name = 'instance';
return function() {
return self;
}
}

所以如果你像这样实例化它:var instance = new Constructor()结果如下:

typeof instance    //returns "function"
typeof instance() //returns "object"
instance() //returns { name: 'instance' }

所以我想我有三个问题:

  1. 这是否合法,是否可以跨浏览器使用?它真的很棒,我认为它可以用在很多方面,但是这种行为可靠吗?
  2. 导致此行为的后台发生了什么?
  3. (可能被 2 回答,但是...)新对象(用 'this' 引用的那个)是否在新实例中,所以它都是独立的并被垃圾收集器正确清理?

最佳答案

  1. 是的,虽然构造函数默认返回正在构造的新对象(由this引用),但您可以覆盖该返回值只要你返回一个对象。因为函数是一个对象,所以您可以像在示例中一样返回它。新创建的对象不是函数本身,但您返回的函数在其变量范围内引用了新创建的对象。

  2. 参见#1

  3. 这是因为函数创建了一个闭包,所以它继续引用 self 变量,而该变量恰好引用了正在构造的实际对象。所以我不会说它在“内部”任何东西,而只是函数变量范围的一部分。

要理解的是,您的函数与任何其他函数没有任何不同。就像您返回一个数组一样,您只会有一个常规数组,它可以引用新对象。

function Constructor() {

this.name = 'instance';
return [ this ]; // Instead return an Array that references the new object
}

关于javascript - 使用 'return' 创建对象时使用 'new',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com