为什么configurable:false允许更改可写标志,但不允许可枚举

时间:2018-10-19 12:12:11

标签: javascript browser ecmascript-6 ecmascript-5

我正在编写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

1 个答案:

答案 0 :(得分:1)

  

为什么可写标志更改时没有引发任何错误。

因为该规范允许将数据属性上的writable标志从true更改为false,即使该属性的configurable属性是false。令人遗憾的是,规范并不能说明为什么是它们的样子,但是通常它们是什么非常精确。 :-)

  

我想知道在以下两种情况下会发生什么:

您最好的选择是read through the specification's steps for the operation

  

1)可配置标志设置为true

在这种情况下,您可以将writablefalse更改为true或从true更改为false;该属性是完全可配置的。

  

2)可配置标志设置为false

该规范允许将数据属性上的writable标志从true更改为false,但不允许false更改为{{1 }}。