什么时候从 get 创建返回对象?

When is the object returned from a get created?

考虑以下代码:

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 而我无法解释这种行为。如果不是 运行ning obj.prop2 它怎么知道 obj.prop2.a 的值呢?

此外,在 console 中,当我们只写 obj.prop2. 时,它建议自动完成,其中 ab。这是怎么发生的,因为我们没有 运行 obj.prop2 ?

When the object {a:1,b:2} is being created? By just running the above code or when we run explicitly 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() 为 运行.

时都会创建一个新的

in console when we just write obj.prop2. it suggests for auto completion, among the other, a and b. How that happens

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

在您的控制台中试试这个:

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

然后输入

obj.prop.

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