我看到了以下有关 javascript、对象数据属性的内容
— 可配置:指定属性是否可以删除或更改。
— 可枚举:指定属性是否可以在 for/in 循环中返回。
— Writable:指定属性是否可以更改。
这里“Configurable”和“Writable”代表的是同一个(属性是否可以改变),那为什么我们需要两个单独的属性呢?
来自:http://ejohn.org/blog/ecmascript-5-objects-and-properties/
Writable:如果为 false,则该属性的值无法更改。
可配置:如果为 false,则任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。
Enumerable:如果为 true,则当用户执行 for (var prop in obj){} (或类似操作)时,将迭代该属性。
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 规范一起定义的操作。场景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
可配置可防止任何使用
Object.defineProperty
“重新定义”键属性的尝试,chrome 将抛出错误信号
未捕获类型错误:无法重新定义属性:foo
可写属性只是避免该值被编辑
如果 Writable 设置为 true 则表示对象属性的值可以更改。
如果 Configurable 设置为 true,则表示对象属性的类型可以从 data 属性更改为 accessor 属性(反之亦然);并且可以删除对象属性。
Object.defineProperty()
文档回答了这个问题。这是经过大量编辑的摘录。我将可配置和可写放在一起,以便两者更容易比较。我仍然包括enumerable
,因为我认为它使答案更有用:
writable
如果与属性关联的值可以通过赋值运算符更改。true
configurable
当设置为
,false
- 该属性的类型不能在数据属性和访问器属性之间更改,并且
- 该属性可能无法删除,并且
- 其描述符的其他属性不能更改(但是,如果它是带有
writable: true
的数据描述符 [1],则可以 已更改,并且value
可以更改为writable
)。false
enumerable
当且仅当该属性在相应对象的属性枚举期间出现。true
1:如果您想了解更多有关此术语的信息,链接的第一段详细描述了它。