1

如果我定义一个对象并将其可配置属性设置为 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

4

1 回答 1

2

错误不是来自dataDesc.writable = true;,而是来自Object.defineProperty(o, "name", dataDesc);... 这是正确的,因为{name : "tom"} 确实已经name定义了一个属性。

这是正确的行为,您可以更改writable无法重新定义name属性。

我认为混乱来自行为,您无需调用即可生效,您可以在这里进行.defineProperty()测试。.writable

注意:我在上面的示例中注释掉了.configurable = false,这将锁定属性属性并且不允许您writable进一步更改,使其停留false在您的原始代码中。

于 2011-06-19T12:09:01.660 回答