32

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

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

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

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

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

4

4 回答 4

33

来自:http ://ejohn.org/blog/ecmascript-5-objects-and-properties/

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

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

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

于 2014-08-19T14:18:17.463 回答
18

configurable并且writable不代表同一件事。

configurable表示属性描述符和存在

writable仅指财产价值

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

场景1 :通过赋值创建属性

'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 :通过描述符创建属性

'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
于 2017-11-17T18:28:31.577 回答
3

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

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

可写属性只是避免编辑该值

于 2016-02-19T13:18:09.087 回答
1

如果 Writable 设置为 true 意味着可以更改对象属性的值。

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

于 2016-08-31T01:43:06.807 回答