对象只读属性

时间:2015-06-17 20:00:01

标签: javascript object

我正在阅读关于只读属性的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中的某些东西如何推断私有财产。

2 个答案:

答案 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