【问题标题】:JavaScript Descriptors: enumerable/configurable/writable are not true by default?JavaScript 描述符:可枚举/可配置/可写默认不正确?
【发布时间】:2017-06-02 02:38:02
【问题描述】:

我正在阅读 John Resig 在 new ES5 features 上的一篇博客,其中一篇是 Object 描述符。约翰在他的博客早些时候写道:

三个属性(可写、可枚举和可配置)都是 可选且全部默认为 true。因此,您将获得的唯一财产 需要提供的将是 value 或 get 和 set。

稍后他提供了一个例子:

var obj = {};

Object.defineProperty( obj, "propertyname", {
    value: true,
    writable: false,
    enumerable: true,
    configurable: true
});

(function() {
    var name = "John";

    Object.defineProperty( obj, "name", {
        get: function(){ return name; },
        set: function(value){ name = value; }
    });
})();

但是,在检查 name 的属性描述符时,它是不可配置或不可枚举的,因此我无法在 for 循环中访问它。

console.log(Object.getOwnPropertyDescriptor(obj, 'name'))
> Object {enumerable: false, configurable: false}

name 不应该既可枚举又可配置?我在这里错过了什么?

【问题讨论】:

  • 在使用Object.defineProperty 时,默认值实际上是false,它是true 用于由文字/赋值创建的“普通”道具。我认为这简化了此类动态道具的通常默认值的编码。查看var obj = {}; Object.defineProperty( obj, "propertyname", { value: true});Object.getOwnPropertyDescriptor(obj, 'propertyname'); 进行完整性检查。
  • 博客写错了。使用Object.defineProperty时默认为false
  • @dandavis 你是说:如果你在其描述符中分配一个属性的值,那么其他属性将自动设置为 true?
  • 刚刚测试了上面的——其他属性仍然是假的。无论如何,你们都是正确的:除非在描述符中明确定义,否则 enumerable/configurable/writable 将是 false 并且 value 将是未定义的。
  • 您引用的参考文献必须至少有 5 年的历史,并且可能是在规范尚未确定的时间点编写的。

标签: javascript descriptor


【解决方案1】:

the spec开始,数据属性默认是不可配置、不可枚举和不可写的。

如果一个属性的属性的初始值不是明确的 本规范指定,使用Table 4中定义的默认值。

表 4:默认属性值

┌──────────────────┬─────────────────┐
│  Attribute Name  │  Default Value  │
├──────────────────┼─────────────────┤
│ [[Value]]        │ undefined       │
│ [[Get]]          │ undefined       │
│ [[Set]]          │ undefined       │
│ [[Writable]]     │ false           │
│ [[Enumerable]]   │ false           │
│ [[Configurable]] │ false           │
└──────────────────┴─────────────────┘

但是,当您通过赋值创建数据属性时,CreateDataProperty 将其定义为可配置、可枚举和可写。

newDesc 为 PropertyDescriptor{[[Value]]: V, [[Writable]]: 真,[[可枚举]]:真,[[可配置]]:真}。

【讨论】:

    【解决方案2】:

    描述符属性的默认值为 false 或 undefined。

    博客有错误。除非在描述符中明确定义,否则enumerable/configurable/writable 将是falsevalue 将是undefined。访问器描述符属性也将默认为 undefined

    这与 MDN notes 并发:

    数据和访问器描述符都是对象。它们共享以下必需的密钥:

    可配置

    当且仅当此属性描述符的类型为真 可能会更改,如果该属性可能会从 对应的对象。默认为 false。

    可枚举

    当且仅当在枚举相应对象的属性期间显示此属性时才为真。默认为 false。

    数据描述符还具有以下可选键:

    价值

    与属性关联的值。可以是任何有效的 JavaScript 值(数字、对象、函数等)。默认为 未定义。

    可写

    当且仅当与 可以使用赋值运算符更改属性。默认为 假的。

    访问器描述符还具有以下可选键:

    获取

    作为属性获取器的函数,或未定义的 如果没有吸气剂。函数返回将用作值 的财产。默认为未定义。

    设置

    作为一个函数 属性的 setter,如果没有 setter,则为 undefined。这 函数将接收分配给的新值作为唯一参数 财产。默认为未定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2020-02-27
      • 2011-06-29
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多