可配置属性与可写对象数据属性之间的区别

时间:2014-05-11 08:24:06

标签: javascript object attributes

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

- 可配置属性:指定是否可以删除或更改属性。 - Enumerable:指定是否可以在for / in循环中返回该属性。 - 可写:指定是否可以更改属性。

这里"可配置属性"和#34;可写"表示相同(属性是否可以更改),那么为什么我们需要两个单独的属性?

4 个答案:

答案 0 :(得分:17)

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

Writable:如果为false,则无法更改属性的值。

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

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

答案 1 :(得分:6)

configurablewritable不代表相同的事情。

configurable表示属性描述符和存在

writable仅表示属性 value

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

方案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

答案 2 :(得分:2)

可配置可防止任何尝试重新定义'具有Object.defineProperty的键的属性,chrome将抛出错误符号

  

未捕获的TypeError:无法重新定义属性:foo

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

答案 3 :(得分:0)

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

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