gpt4 book ai didi

javascript - Object.defineProperties() 中的自引用

转载 作者:行者123 更新时间:2023-11-30 10:00:20 24 4
gpt4 key购买 nike

向对象添加多个属性时,使用 Object.defineProperties() 添加它们通常会生成比一个一个或成组添加更清晰、更易读的代码。

但是,如果一个属性引用另一个属性,Object.defineProperties() 无法处理它。考虑一个虚拟示例:

var foo = {};
Object.defineProperties(foo, {
"one" : {value: 1, enumerable: true},
"two" : {value: foo.one + 1, enumerable: true}
})
console.log(foo); // { one: 1, two: NaN }

var bar = {};
Object.defineProperties(bar,{
"one" : {value: 1, enumerable: true}
});
Object.defineProperties(bar,{
"two" : {value: bar.one + 1, enumerable: true}
});

console.log(bar); // { one: 1, two: 2 }

现在很明显,第二种解决方案总是有效的。但是,人们会假设第一个也可以工作,因为它似乎是另一个的简写并且建议顺序处理属性。

我没有找到关于此的明确文档。

所以问题是:

  • 这是有意限制还是背景技术复杂?
  • 是否在某处记录了它?
  • 它是特定于实现还是标准行为?

编辑:回答清楚,并在那里看到我的评论。这是一个简单的对象字面量问题(不是问题,而是 :),与 Object.defineProperties() 没有直接关系。

最佳答案

这个问题实际上与 Object.defineProperties() 没有太大关系。问题在于对象初始值设定项表达式(“对象文字”是另一个术语)的计算方式。一个对象初始化器一个表达式,在它被计算之前,它正在初始化的对象并不真正存在。因此,在

Object.defineProperties(foo, {
"one" : {value: 1, enumerable: true},
"two" : {value: foo.one + 1, enumerable: true}
});

对象初始化子表达式是

{
"one" : {value: 1, enumerable: true},
"two" : {value: foo.one + 1, enumerable: true}
}

在调用 Object.defineProperties() 之前必须对其进行评估。在对它进行评估时,foo 没有名为“one”的属性;即使是这样,对象初始值设定项被评估时的值也将是之前的值,而不是新值。

这正是对象初始化器表达式的工作方式。不可能直接引用从表达式中初始化的对象。这意味着即使在这样的声明中:

var foo = {
"one" : {value: 1, enumerable: true},
"two" : {value: foo.one + 1, enumerable: true}
};

你还是遇到同样的问题。

关于javascript - Object.defineProperties() 中的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074096/

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