我看到以下关于 javascript、对象数据属性的内容
— 可配置:指定是否可以删除或更改属性。
— 可枚举:指定属性是否可以在 for/in 循环中返回。
— Writable:指定属性是否可以更改。
这里的“Configurable”和“Writable”代表的是相同的(属性是否可以改变),那我们为什么需要两个单独的属性呢?
我看到以下关于 javascript、对象数据属性的内容
— 可配置:指定是否可以删除或更改属性。
— 可枚举:指定属性是否可以在 for/in 循环中返回。
— Writable:指定属性是否可以更改。
这里的“Configurable”和“Writable”代表的是相同的(属性是否可以改变),那我们为什么需要两个单独的属性呢?
来自:http ://ejohn.org/blog/ecmascript-5-objects-and-properties/
Writable:如果为false,则属性的值不能被改变。
Configurable:如果为 false,则任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。
可枚举:如果为 true,则当用户执行 for (var prop in obj){} (或类似)时,该属性将被迭代。
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,
// ...
});
CreateDataProperty
是与ECMAScript 规范一起定义的操作。场景 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
Configurable 可防止任何尝试使用 '重新定义' 键的属性Object.defineProperty
,chrome 将抛出错误标志
未捕获的类型错误:无法重新定义属性:foo
可写属性只是避免编辑该值
如果 Writable 设置为 true 意味着可以更改对象属性的值。
如果 Configurable 设置为 true,则表示对象属性的类型可以从数据属性更改为访问器属性(反之亦然);并且可以删除对象属性。