我看到以下内容,关于javscript,对象数据属性属性
- 可配置属性:指定是否可以删除或更改属性。 - Enumerable:指定是否可以在for / in循环中返回该属性。 - 可写:指定是否可以更改属性。
这里"可配置属性"和#34;可写"表示相同(属性是否可以更改),那么为什么我们需要两个单独的属性?
答案 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)
configurable
和writable
不代表相同的事情。
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,
// ...
});
CreateDataProperty
是与ECMAScript spec一起定义的操作。方案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属性(反之亦然);并且可以删除对象属性。