我正在编写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包含一个属性,即name:“heman”。我将name属性的可配置标志设置为false(可配置:false)。然后我尝试再次将可配置标志更改为true它抛出了一个错误。在我尝试将可枚举标志更改为与其默认值相反的错误后,它再次引发错误。这次我试图将可写标志更改为false。标志发生了变化,没有任何错误。即使将可配置标志设置为false,为什么属性仍然可配置?为什么可写标志会发生变化而不会抛出任何错误。我想知道在以下两种情况下会发生什么:
1)可配置标志设置为true
2)可配置标志设置为false
为什么可写标志会发生变化而不会抛出任何错误。
因为规范允许将数据属性上的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
更改为true
。