请考虑以下代码:
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.
时,它建议自动完成,其中a
和b
。怎么会发生这种情况,因为我们没有运行obj.prop2
?
答案 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函数。