我正在阅读关于只读属性的this问题,我发现了这个片段:
var myObject = {
get readOnlyProperty() { return 42; }
};
alert(myObject.readOnlyProperty); // 42
myObject.readOnlyProperty = 5; // Assignment is allowed, but doesn't do anything
alert(myObject.readOnlyProperty); // 42
现在,我知道要隐藏范围,你可以使用IIFE,也可以使变量或属性“私有”,但我不明白的是:
为什么允许分配,如果允许,怎么可能没有发生?在这个片段中没有推断范围,所以我不明白JS中的某些东西如何推断私有财产。
答案 0 :(得分:6)
为什么允许分配,如果允许,怎么可能没有发生?在这个片段中没有推断范围,所以我不明白JS中的某些东西如何推断私有财产。
因为赋值(在严格模式之前)从不抛出并使其抛出会违反人们期望的那种不变量。虽然您仍然可以覆盖它(通过创建一个setter并使 抛出),但这是JavaScript中属性的默认行为。我们不喜欢它,但它就是它。
如果你使用严格模式 - 你应该得到:
TypeError:设置只有getter的属性
答案 1 :(得分:2)
对象文字表达式中的getter和setter比ES5中使用的Object.defineProperty()
纯糖。
当获取某个对象的属性时,getter的作用是返回某个值。
let obj = {};
obj.foo = 3; // I am SETTING a property value
obj.foo; // I am GETTING the property value
因此,无论何时定义getter
,每次请求属性时,都会获得getter
返回的值。
所以,如果你有
let obj = {};
Object.defineProperty(obj, 'readOnly', {
'get': function() { return 42; }
});
或者
let obj = {
get readOnly() { return 42; }
};
您的变量将始终 42,因为它只能返回该值。 您可以尝试将该属性设置为任何值,但最终它将始终返回42.
要禁止分配,您可以添加一个setter并将其设为throw Error