【问题标题】:Difference between Configurable and Writable attributes of an Object对象的可配置属性和可写属性之间的区别
【发布时间】:2014-06-28 17:19:28
【问题描述】:
我看到以下关于 javascript,对象数据属性属性的内容
——可配置:指定属性是否可以删除或更改。
——可枚举:指定属性是否可以在 for/in 循环中返回。
——可写:指定属性是否可以更改。
这里的“Configurable”和“Writable”代表的是同一个(属性是否可以改变),那我们为什么需要两个单独的属性呢?
【问题讨论】:
标签:
javascript
object
ecmascript-6
attributes
【解决方案2】:
configurable 和 writable 代表的不是同一个东西。
configurable 表示属性描述符和存在。
writable 仅表示属性值。
属性的描述符包含值、可枚举、可配置和可写。
场景1:通过assignment
创建属性
'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:通过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
【解决方案3】:
Configurable 可防止任何尝试使用Object.defineProperty“重新定义”键的属性,chrome 会抛出错误标志
未捕获的类型错误:无法重新定义属性:foo
可写属性只是避免这个值被编辑
【解决方案4】:
如果 Writable 设置为 true,则表示对象属性的值可以更改。
如果 Configurable 设置为 true,则表示对象属性的类型可以从数据属性更改为访问器属性(反之亦然);并且可以删除对象属性。