Object.defineProperty(obj,“prop”,desc)表现得很奇怪

时间:2011-06-19 11:58:56

标签: javascript object google-chrome ecmascript-5

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

1 个答案:

答案 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}}在原始代码中。