对象的可配置属性和可写属性之间的区别
Posted
技术标签:
【中文标题】对象的可配置属性和可写属性之间的区别【英文标题】:Difference between Configurable and Writable attributes of an Object 【发布时间】:2014-06-28 17:19:28 【问题描述】:我看到以下关于 javascript,对象数据属性属性的内容
——可配置:指定属性是否可以删除或更改。
——可枚举:指定属性是否可以在 for/in 循环中返回。
——可写:指定属性是否可以更改。
这里的“Configurable”和“Writable”代表的是同一个(属性是否可以改变),那我们为什么需要两个单独的属性呢?
【问题讨论】:
I don't understand writable and configurable property attributes of Objects的可能重复 【参考方案1】:发件人:http://ejohn.org/blog/ecmascript-5-objects-and-properties/
Writable:如果为false,则属性的值不能改变。
Configurable:如果为 false,任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。
Enumerable:如果为 true,则当用户执行 for (var prop in obj)(或类似)时,该属性将被迭代。
【讨论】:
【参考方案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,
// ...
);
CreateDataProperty
是与ECMAScript spec 一起定义的操作。
场景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,则表示对象属性的类型可以从数据属性更改为访问器属性(反之亦然);并且可以删除对象属性。
【讨论】:
以上是关于对象的可配置属性和可写属性之间的区别的主要内容,如果未能解决你的问题,请参考以下文章