如果我定义一个对象并将其可配置属性设置为 false,但不理会所有其他 props,然后尝试将该对象的可写 prop 设置为 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"
}
}
我在规范中找不到任何帮助,但定义属性的 MDC 文章指出,即使在对象属性呈现为不可配置之后,仍可以修改可写数据描述符。所有其他的都不能,但 writable 可以。
那么,这是 Chrome 中的东西,还是我做错了?
/* 更新 */
这已解决 - 只需阅读规范 8.12.9 部分 10.ai