“面向Web开发人员的第三版PROFESSIONALJavaScript®”一书中说:
此外,一旦属性被定义为不可配置,它就会 无法再次配置。任何试图打电话 Object.defineProperty()并更改除可写之外的任何属性 导致错误。
'use strict';
var obj = {};
Object.defineProperty(obj, 'key', {
value:'static'
});
Object.defineProperty(obj, 'key', {
writable: true,
});
我在上面写了一个代码片段,但是它会抛出一个错误。 这本书说我可以重新定义可写属性。为什么会导致错误?
答案 0 :(得分:1)
为什么会导致错误?
如果属性不可配置,则其
writable
属性只能更改为false
。
因此,本书中的陈述不够准确:您可以在不可配置的属性上更改writable
,但只能从true
更改为false
,而不是相反,这就是你想要做的事情。
答案 1 :(得分:1)
如果configurable
属性为true,则只能将属性从非可写更改为可写。 (ECMA-262第7版,§6.1.7.1)默认情况下,它是假的。
如果要在创建属性后为其配置元数据,请将configurable: true
添加到第一个defineProperty
。
'use strict';
var obj = {};
Object.defineProperty(obj, 'key', {
value:'static',
configurable: true
});
Object.defineProperty(obj, 'key', {
writable: true,
});
console.log(Object.getOwnPropertyDescriptor(obj, 'key'));
答案 2 :(得分:0)
当您在Object.defineProperty
中跳过属性描述符时,它们会取代某些默认值。
对于writable
描述符,默认值为false
,这意味着第一次不设置它具有与此相同的效果:
Object.defineProperty(obj, 'key', {
value:'static',
writable: false
});
如果您明确将writable
设置为true
并重新运行代码,则会看到没有抛出异常。