1 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
JavaScript 中的所有內(nèi)容都是按值傳遞的,但碰巧對(duì)象的值是它的引用。然而,這里重要的是對(duì)于原語(yǔ),當(dāng)引用的變量發(fā)生變化時(shí)不會(huì)發(fā)生變化:
var a = "world";
var obj = {
b: "hello" + a //evaluated once
}
a = "universe"; //does not modify obj.b which references a
console.log(obj.b); //helloworld
為了獲得動(dòng)態(tài)計(jì)算的字符串,您需要調(diào)用一個(gè)函數(shù)或方法:
var a = "world";
var obj = {
b: function() {
return "hello" + a //evaluated every time the function is executed
}
}
console.log(obj.b()); //helloworld
a = "universe"; //will influence obj.b
console.log(obj.b()); //hellouniverse
然而,這看起來(lái)有點(diǎn)“臟”,因?yàn)樗仁拐{(diào)用者知道每次都評(píng)估屬性。如果某些屬性是純字符串,而其他屬性是函數(shù),則它還會(huì)引入不一致,如果屬性必須從一個(gè)更改為另一個(gè),則尤其煩人 - 您需要修改調(diào)用此代碼的每個(gè)位置以更改,例如更改obj.c為obj.c().
相反,使用 ES6+,您可以為屬性定義一個(gè) getter,該屬性將執(zhí)行與以前相同的操作,但會(huì)隱藏函數(shù)調(diào)用,因此無(wú)論何時(shí)您讀取一個(gè)屬性,您實(shí)際上都會(huì)評(píng)估代碼以返回結(jié)果:
var a = "world";
var obj = {
c: "plain property"
}
Object.defineProperty(obj, 'b', {
get: function() {
return "hello" + a //evaluated every time the property is read
}
});
console.log(obj.b); //helloworld
a = "universe"; //will influence obj.b
console.log(obj.b); //hellouniverse
console.log(obj.c); //plain property
添加回答
舉報(bào)