何时从get创建的对象返回?

时间:2016-04-21 10:40:02

标签: javascript getter

请考虑以下代码:

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

1 个答案:

答案 0 :(得分:6)

  

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

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



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函数。