【问题标题】:Object Read-Only Properties对象只读属性
【发布时间】:2015-09-03 06:13:33
【问题描述】:

我正在阅读this 关于只读属性的问题,我遇到了这个 sn-p:

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,也可以将变量或属性设为“私有”,但我不明白的是:

为什么允许分配,如果允许,怎么可能什么都不会发生?在这个 sn-p 中没有推断范围,所以我不明白 JS 中的某些东西如何推断私有属性。

【问题讨论】:

  • 它不是“私有”,它使用“get”关键字运行一个函数,该函数在您引用属性时返回值。
  • 添加一个set readOnlyProperty() 函数,该函数会引发错误以阻止赋值。
  • 用户不能只定义一个setter方法并覆盖这个只读方面吗?
  • @SterlingArcher 如果你 Object.freeze 则不会。如果你用.definePropety 做它也是安全的(见可配置和可写)
  • @SterlingArcher 您只能在字面量对象定义中使用set/get,因此您不能创建一个setter(使用这个set/get字面量语法)新对象。不过,您可以使用Object.defineProperty 重新定义属性(除非属性具有configurable: false,或者对象被冻结)。

标签: javascript object


【解决方案1】:

为什么允许分配,如果允许,怎么可能什么都不会发生?在这个 sn-p 中没有推断范围,所以我不明白 JS 中的某些东西如何推断私有属性。

因为赋值(在严格模式之前)永远不会抛出,并且让它抛出会违反人们期望的不变量。虽然您仍然可以覆盖它(通过创建一个 setter 并让 that 抛出),但这是 JavaScript 中属性的默认行为。我们不喜欢它,但它就是这样。

如果你使用严格模式 - 你应该得到:

TypeError: 设置一个只有 getter 的属性

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2014-06-21
      • 1970-01-01
      • 2010-12-02
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多