如果我定义一个对象并将其可配置属性设置为false,但保留所有其他道具,然后尝试将该对象的可写道具设置为false,然后返回true,则抛出TypeError。
这是我如何做到这一点的细分,虽然我通过改变点表示法中的一个对象数据描述符,以及通过改变对象文字中对象的所有数据描述符来尝试这一点,并且两种形式都没有起作用。
// simple object, and the data descriptor
var o = {name : "tom"},
dataDesc = Object.getOwnPropertyDescriptor(o, "name");
noConfig();
alert(dataDesc.writable); // alerts true
readOnly();
alert (dataDesc.writable); // alerts false
writable();
alert (dataDesc.writable); // error is thrown within writable() - alerts true
// early in the script, altering only configurable property
function noConfig(){
dataDesc.configurable = false;
}
// later in the script, altering only writable property
function readOnly(){
dataDesc.writable = false; // configurable = false; writable = false;
Object.defineProperty(o, "name", dataDesc); // works finely
}
function writable(){
try{
dataDesc.writable = true; // configurable = false; writable = true;
Object.defineProperty(o, "name", dataDesc); // throws TypeError
}catch(e){
alert(e); // alerts: "TypeError: Cannot redefine property: defineProperty"
}
}
我在规范中找不到任何帮助,但是针对defineProperty的MDC文章指出,即使在对象属性呈现为不可配置之后,仍然可以修改可写数据描述符。所有其他人都不能,但可写。
那么,这是Chrome中的内容,还是我做错了?
/ * UPDATE * /
这已经解决 - 只需阅读规范8.12.9第10.a.i节
答案 0 :(得分:2)
错误不是来自dataDesc.writable = true;
,它来自Object.defineProperty(o, "name", dataDesc);
...这是正确的,因为{name : "tom"}
已经有{{} 1}}属性定义。
这是正确的行为,您 能够更改name
而 无法重新定义writable
属性。
我认为混淆来自行为,您无需致电name
.defineProperty()
即可生效you can test it here。
注意:我在上面的示例中注释了.writable
,它会锁定属性属性,并且不允许您进一步更改.configurable = false
,使其卡在{{ 1}}在原始代码中。