重新定义对象属性的属性会导致错误

时间:2016-08-09 06:12:02

标签: javascript

“面向Web开发人员的第三版PROFESSIONALJavaScript®”一书中说:

  

此外,一旦属性被定义为不可配置,它就会   无法再次配置。任何试图打电话   Object.defineProperty()并更改除可写之外的任何属性   导致错误。

'use strict';
var obj = {};
Object.defineProperty(obj, 'key',  {
  value:'static'
});

Object.defineProperty(obj, 'key', {
  writable: true,
});

我在上面写了一个代码片段,但是它会抛出一个错误。 这本书说我可以重新定义可写属性。为什么会导致错误?

3 个答案:

答案 0 :(得分:1)

  

为什么会导致错误?

MDN says

  

如果属性不可配置,则其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并重新运行代码,则会看到没有抛出异常。