【问题标题】:{configurable:false} or Object.seal() is not working correctly [duplicate]{configurable:false} 或 Object.seal() 无法正常工作 [重复]
【发布时间】:2017-10-22 13:46:49
【问题描述】:

我正在尝试学习 javascript,并且已经看到我们可以使用对象的属性。 (我的意思是可写可枚举可配置)。

据我所知,我认为更改 {configurable: false} 会限制任何更多的配置更改,例如 {writable: false, enumerable: false}

我已经写在下面尝试一下,但我得到的结果与我预期的结果完全不同。

我对 {configurable:false} 的含义有什么误解,或者代码有问题吗? TIA。

"use strict";

window.onload = function(){

  var o = {x:1};

  //Make "x" non-configurable
  Object.defineProperty(o, "x", {configurable: false});
  //Seal "o";
  Object.seal(o);

  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
  console.log(Object.isSealed(o));
  //outputs => true

  Object.defineProperty(o, "x", {writable: false}); //this doesn't cause any errors.
  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
}

【问题讨论】:

    标签: javascript immutability defineproperty


    【解决方案1】:

    MDN - seal

    可配置属性
    可配置属性同时控制该属性是否可以从对象中删除以及是否可以更改其属性(可写为false除外)

    Object.seal()
    方法密封对象,防止向其添加新属性并将所有现有属性标记为不可配置。现有属性的值仍然可以更改,只要它们是可写的。

    你需要freeze

    MDN - freeze

    与 Object.seal() 的比较 使用 Object.seal() 密封的对象可以更改其现有属性。使用 Object.freeze() 冻结的对象中的现有属性是不可变的。

    "use strict";
    
    window.onload = function(){
    
      var o = {x:1};
    
      //Make "x" non-configurable
      Object.defineProperty(o, "x", {configurable: false});
      //freeze "o";
      Object.freeze(o);
    
      console.log(Object.getOwnPropertyDescriptor(o, "x"));
      //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
      console.log(Object.isSealed(o));
      //outputs => true
    
      Object.defineProperty(o, "x", {writable: true}); //Now this doesn't cause.
      console.log(Object.getOwnPropertyDescriptor(o, "x"));
      //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
    }

    【讨论】:

    • 感谢您引入新功能,但我不希望所有属性都变为只读。此外,将 writable 设置为 false 仅用于示例目的。为什么我能够在密封属性并标记可配置为 false 后配置属性
    • 因为seal 允许您编辑现有属性。
    • 您的答案是相反的 Object.seal() 方法密封一个对象,防止向其中添加新属性并将所有现有属性标记为不可配置。我没有看到可配置:false 的工作原理吗?
    • 但仍可写 - writable 已存在且可以更改,我们无法向其添加新属性。冻结它确实会阻止所有突变。
    • 那么,请问,configurable:false 有什么好处
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2015-09-06
    • 2016-05-06
    • 2016-05-12
    • 2018-07-19
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多