鉴于以下代码是foo
,bar
和baz
都有效吗?如果使用get
关键字有什么优势呢?
var getValue = function () {
return 'value';
}
var foo = {
value: getValue(),
};
var bar = {
get value() {
return getValue();
},
};
var baz = {
get value() {
return 'value';
},
};
console.log('foo.value', foo.value); // foo.value value
console.log('bar.value', bar.value); // bar.value value
console.log('baz.value', baz.value); // baz.value value
鉴于以下代码是foo,bar和baz都有效吗?
一点都不。
foo
将有一个value
属性,这将是getValue
创建时调用foo
的结果,并且不会在以后调用getValue
。bar
将有一个value
属性,当像bar.value
一样访问时,调用getValue
并返回其返回值。baz
将有一个value
属性,其显式值为'value'
。不同之处是:
getValue
被称为getValue
被召唤对于某些日志记录以及getValue
稍微更新的版本,这一点更为明显:
var getValue = function () {
var value = Math.floor(Math.random() * 1000);
console.log("getValue called, returning " + value);
return value;
}
console.log("Creating foo");
var foo = {
value: getValue(),
};
console.log("Creating bar");
var bar = {
get value() {
return getValue();
},
};
console.log("Creating baz");
var baz = {
get value() {
return 42;
},
};
console.log("Calling foo");
console.log('foo.value', foo.value);
console.log("Calling bar");
console.log('bar.value', bar.value);
console.log("Calling baz");
console.log('baz.value', baz.value);
.as-console-wrapper {
max-height: 100% !important;;
}
getter的优点(和缺点)是您可以执行逻辑(例如调用getValue
)以响应看起来像简单的属性查找(bar.value
,而不是bar.value()
或bar.getValue()
)。