1 回答
![?](http://img1.sycdn.imooc.com/545862e700016daa02200220-100-100.jpg)
TA贡献1789条经验 获得超10个赞
JavaScript 中的所有内容都是按值传递的,但碰巧对象的值是它的引用。然而,这里重要的是对于原语,当引用的变量发生变化时不会发生变化:
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
为了获得动态计算的字符串,您需要调用一个函数或方法:
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
然而,这看起来有点“脏”,因为它迫使调用者知道每次都评估属性。如果某些属性是纯字符串,而其他属性是函数,则它还会引入不一致,如果属性必须从一个更改为另一个,则尤其烦人 - 您需要修改调用此代码的每个位置以更改,例如更改obj.c为obj.c().
相反,使用 ES6+,您可以为属性定义一个 getter,该属性将执行与以前相同的操作,但会隐藏函数调用,因此无论何时您读取一个属性,您实际上都会评估代码以返回结果:
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
添加回答
举报