gpt4 book ai didi

javascript - Object.defineProperty(obj, "prop", desc) 行为异常

转载 作者:行者123 更新时间:2023-11-30 18:42:42 26 4
gpt4 key购买 nike

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

我在规范中找不到任何帮助,但是 defineProperty 的 MDC 文章指出,即使在对象属性呈现为不可配置之后,仍然可以修改可写数据描述符。所有其他的都不能,但可写的可以。

那么,这是 Chrome 中的某些东西,还是我做错了?

/* 更新 */

这已经解决 - 只需阅读规范 8.12.9 第 10.a.i 节

最佳答案

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

这是正确的行为,您可以更改可写并且不能重新定义名称属性(property)。

我认为混淆来自于行为,你不需要为 .writable 调用 .defineProperty() 来生效,you can test it here .

注意:我在上面的例子中注释掉了.configurable = false,这样会锁定property属性,不允许你改变writable 进一步,让它在你的原始代码中停留在 false 中。

关于javascript - Object.defineProperty(obj, "prop", desc) 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6402214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com