何时从创建返回对象

When is the object returned from a get created?

本文关键字:对象 返回 创建 何时      更新时间:2023-09-26

请考虑以下代码:

var obj={
       prop1:7,
       get prop2 (){
          console.log('I ran');
          return {a:1,b:2}     
       }
}

何时创建对象{a:1,b:2}

当上面的代码运行时或当我们显式运行时obj.prop2?我之所以遇到这个查询,是因为通过编写obj.prop2.a我们得到 1,我无法解释这种行为。如果不运行obj.prop2它如何知道obj.prop2.a的值?

此外,在控制台中,当我们只编写obj.prop2.时,它建议自动完成,其中包括 ab .这是怎么发生的,因为我们没有跑obj.prop2

何时创建对象 {a:1,b:2}?通过运行上面的代码或当我们显式运行时 obj.prop2 ?

后者,当我们访问时 obj.prop2 ,运行 getter 函数。尤其是因为每次访问它时,您都会返回一个不同的对象:

var obj={
       prop1:7,
       get prop2 (){
          console.log('I ran');
          return {a:1,b:2}     
       }
};
document.body.innerHTML = obj.prop2 == obj.prop2; // false

完全是这样的:

// One:
var obj = {
    f: function() {
        return {a:1, b:2};
    }
};
// Two:
obj.f();

对象{a:1, b:2}是在 Two: 创建的,而不是在 One: 创建的。每次运行f()时都会创建一个新。

在控制台中,当我们只编写 obj.prop2 时。 它建议自动完成,其中包括 A 和 B。这是如何发生的

它读取属性。毕竟,它是一个属性,所以就像控制台读取任何其他属性以获取其值并执行自动建议一样,它会读取此属性。您可以在您的示例中看到这一点(至少在 Chrome 上),因为当我们在 obj.prop2 之后点击 . 时,我们看到"我跑了"。

在控制台中尝试此操作:

var obj = {
    x: 1,
    get prop() {
        var o = {};
        ++this.x;
        o["___" + this.x] = "foo";
        return o;
    }
};

然后键入

obj.prop.

。并注意顶部(可能)名称为 ___1 的属性。现在在.上退格,然后再次按.。您会看到不同的属性,___2 。再做一次,你会看到___3.这是因为控制台读取属性,调用 getter 函数。