2017-09-24 110 views
0
var person = {}; 

Object.defineProperty(person,"name",{ 
    writable: true, 
    configurable: false, 
    value: "Sahand" 
}); 

alert(person.name); // "Sahand" 
person.name = "Mahmoud"; 
alert(person.name); // "Mahmoud" 

Object.defineProperty(person, "name", { 
    writable: false 
}); 

person.name = "Sandra"; // "Mahmoud" 
alert(person.name); 

Object.defineProperty(person, "name", { // Error 
    writable:true 
}); 

person.name = "Sahand"; 

在这段代码中,defineProperty()在调用的前两次都正常工作,但第三次抛出一个错误。这让我感到困惑,因为我认为如果对象在第一个defineProperty()呼叫中有configurable:false,则任何连续的defineProperty()调用都会​​引发错误。相反,在设置writable:false后,第一个没有,但另一个没有。这里的规则是什么?Object.defineProperty()何时抛出错误?

+0

[为什么我可以设置\ [enumerability和\]不可配置属性描述符的可写性?](https://stackoverflow.com/q/9829817/1048572) – Bergi

回答

0

从MDN的Object.defineProperty docs

同时可配置属性控制是否该属性可以从对象被删除,其属性(不是写假等)是否可以改变的。

因此,任何无法配置的不可配置对象都会抛出。但将其更改为writable: false即使在不可配置的情况下也不是无效的。