【问题标题】:Difference between Configurable and Writable attributes of an Object对象的可配置属性和可写属性之间的区别
【发布时间】:2014-06-28 17:19:28
【问题描述】:

我看到以下关于 javascript,对象数据属性属性的内容

——可配置:指定属性是否可以删除或更改。

——可枚举:指定属性是否可以在 for/in 循环中返回。

——可写:指定属性是否可以更改。

这里的“Configurable”和“Writable”代表的是同一个(属性是否可以改变),那我们为什么需要两个单独的属性呢?

【问题讨论】:

标签: javascript object ecmascript-6 attributes


【解决方案1】:

发件人:http://ejohn.org/blog/ecmascript-5-objects-and-properties/

Writable:如果为false,则属性的值不能改变。

Configurable:如果为 false,任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。

Enumerable:如果为 true,则当用户执行 for (var prop in obj){}(或类似)时,该属性将被迭代。

【讨论】:

    【解决方案2】:

    configurablewritable 代表的不是同一个东西。

    configurable 表示属性描述符和存在

    writable 仅表示属性

    属性的描述符包含值、可枚举、可配置和可写

    场景1:通过assignment

    创建属性
    'use strict';  // non-strict mode behaves slightly different
    
    var foo = {};
    foo.bar = 1;  // operated by CreateDataProperty*
    
    // the above is the same as
    Object.defineProperty(foo, 'bar', {
      value: 1,
      configurable: true,
      writable: true,
      // ...
    });
    

    场景2:通过descriptor

    创建属性
    'use strict';  // non-strict mode behaves slightly different
    
    var foo = {};
    Object.defineProperty(foo, 'bar', {
      value: 1,
      // configurable => false
      // writable => false
    });
    
    foo.bar = 2;    // throw TypeError: Cannot assign to read only property
    
    Object.defineProperty(foo, 'bar', {
      value: 2
      // ...
    }); // throw TypeError: Cannot redefine property
    
    delete foo.bar; // throw TypeError: Cannot delete property
    

    【讨论】:

      【解决方案3】:

      Configurable 可防止任何尝试使用Object.defineProperty“重新定义”键的属性,chrome 会抛出错误标志

      未捕获的类型错误:无法重新定义属性:foo

      可写属性只是避免这个值被编辑

      【讨论】:

        【解决方案4】:

        如果 Writable 设置为 true,则表示对象属性的值可以更改。

        如果 Configurable 设置为 true,则表示对象属性的类型可以从数据属性更改为访问器属性(反之亦然);并且可以删除对象属性。

        【讨论】:

          猜你喜欢
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多