JavaScript"如何写"属性描述符工作?

时间:2013-11-10 16:55:17

标签: javascript object properties ecmascript-5

为什么JavaScript“可写”属性描述符不禁止任何属性更改?

例如:

var TheDarkKnight = Object.create(Superhero, {
    "name": {
        value:"Batman",
        writable:"false"
    }
});

TheDarkKnight.name; //"Batman";

TheDarkKnight.name = "Superman";
TheDarkKnight.name; //"Superman";

在我尝试将其更改为其他值后,我认为TheDarkKnight.name仍应返回"Batman",因为我将“可写”属性描述符设置为false

那么如何以正确的方式使用它?

1 个答案:

答案 0 :(得分:4)

应该是false,而不是"false"。换句话说,它应该是一个布尔值。

如果你没有传递一个布尔值,那么你提供的任何值都将被强制转换为布尔值Boolean("false") === true; // true,所以你实际上已经传递了writable:true

var TheDarkKnight = Object.create(Superhero, {
    "name": {
        value:"Batman",
        writable:false // boolean false (or any falsey value)
    }
});

TheDarkKnight.name; //"Batman";

TheDarkKnight.name = "Superman";
TheDarkKnight.name; //"Batman";

另外,请注意writable:false是默认值,因此如果您只是从描述符中删除该设置,则该属性将不可写。