我正在编写JavaScript程序,以了解将设置为false的可配置标志如何影响该属性。该程序是:
let user={
name:"heman"
};
Object.defineProperty(user, "name",{
configurable:false
});
try{
Object.defineProperty(user, "name",{
configurable:true
})
}//Throws error
catch(err){console.log(err)}
try{
Object.defineProperty(user, "name",{
enumerable:false
});
} //Throws Error
catch(err){console.log(err)}
try{
Object.defineProperty(user, "name", {
writable:false
});
} //Does'nt Throws Error. But Why?
catch(err){console.log(err)}
在此程序中,我首先创建了一个名为user的对象,user包含一个属性,即名称:“ heman”。我将name属性的可配置标志设置为false(可配置:false)。然后,我尝试将可配置标志再次更改为true,这引发了错误。在尝试将可枚举标志更改为false后,这与它的默认值相反。它再次引发错误。这次,当我尝试将可写标志更改为false时。标志已更改,没有引发任何错误。即使在将可配置标志设置为false之后,为什么该属性仍可配置?为什么可写标志发生更改而没有引发任何错误。我想知道以下两种情况会发生什么:
1)可配置标志设置为true
2)可配置标志设置为false
答案 0 :(得分:1)
为什么可写标志更改时没有引发任何错误。
因为该规范允许将数据属性上的writable
标志从true
更改为false
,即使该属性的configurable
属性是false
。令人遗憾的是,规范并不能说明为什么是它们的样子,但是通常它们是什么非常精确。 :-)
我想知道在以下两种情况下会发生什么:
您最好的选择是read through the specification's steps for the operation。
1)可配置标志设置为true
在这种情况下,您可以将writable
从false
更改为true
或从true
更改为false
;该属性是完全可配置的。
2)可配置标志设置为false
该规范允许将数据属性上的writable
标志从true
更改为false
,但不允许从false
更改为{{1 }}。