【问题标题】:How to change writable enumerable and configurable values of a Javascript object property?如何更改 Javascript 对象属性的可写可枚举和可配置值?
【发布时间】:2014-12-12 04:58:09
【问题描述】:

来自节点repl:

foo = { bar: 'baz'};
console.log (Object.getOwnPropertyDescriptor(foo, 'bar'))

返回值:

{ value: 'baz',
  writable: true,
  enumerable: true,
  configurable: true }

如何将可写可枚举和可配置更改为 false?这些值叫什么?它们是 ES5.1 的一部分吗?是否还有其他 repl 没有输出的内容?

【问题讨论】:

  • 请使用{} 按钮格式化您的代码,不要使用斜体、粗体等...

标签: javascript


【解决方案1】:

“如何将可写可枚举和可配置更改为 false?”

Object.defineProperty(foo, 'baz', {
    enumerable:false,
    writable:false,
    configurable:false
});

还有Object.defineProperties,除了可以设置多个属性之外,它是相同的,还有Object.create,它可以让你创建一个新对象,并设置它的原型对象和它的描述符。

“这些值叫什么?”

它们是属性描述符。

“它们是 ES5.1 的一部分吗?”

是的,ES5。

repl 没有输出的还有更多吗?”

还有什么,属性描述符?没有。

【讨论】:

  • 我认为IE8不支持上述方法,但在经典的ecmascript中,即旧版本我们可以控制属性的枚举和配置吗?
  • 如何更改现有对象的描述符?
  • @mqklin:这个答案说明了如何。在示例中,foo 是现有对象,bar 是正在更改其描述符的属性。
【解决方案2】:

squint:我认为您的回答中有一点打字错误。

您的代码:

Object.defineProperty(foo, 'baz', {
enumerable:false,
writable:false,
configurable:false
});

但第二个参数必须是属性的名称而不是值,所以正确的代码是:

Object.defineProperty(foo, 'bar', {
enumerable:false,
writable:false,
configurable:false
});

【讨论】:

    【解决方案3】:

    只是想添加这个

    您可以在第一次创建对象时更改属性,如下所示:

    var newObj = Object.defineProperty({}, 'aPropertyName', {
        enumerable:false,
        writable:false,
        configurable:false
    });
    

    您也可以,您可以一次更改多个属性:

    var newObj = Object.defineProperties({}, {
        aPropertyName: {enumerable: false, writable: false, configurable: false},
        anotherPropertyName: {enumerable: true, writable: true, configurable: false},
        finalPropertyName: {enumerable: true, writable: false, configurable: true},
    });
    

    当然还有用之前的方法传入对象名:

    Object.defineProperties(objectName, {
        aPropertyName: {enumerable: false, writable: false, configurable: false},
        anotherPropertyName: {enumerable: true, writable: true, configurable: false},
        finalPropertyName: {enumerable: true, writable: false, configurable: true},
    });
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2014-06-28
      • 2014-05-22
      • 2014-02-28
      • 2018-12-18
      • 2017-04-25
      相关资源
      最近更新 更多