提问人:mishar 提问时间:7/23/2023 更新时间:7/23/2023 访问量:56
JavaScript:重复的属性名称和 getter/setter 在 ES5 中出现错误?
JavaScript: duplicate property name and getter/setter an error in ES5?
问:
这里的 JS 菜鸟:如果使用具有特定名称的 getter/setter 与取值的属性名称相同,并且在严格模式下的代码中,ES5 中会发生错误吗?例如(是的,我知道我没有正确使用下面的 getter 和 setter 来达到它们的目的):
"use strict"; //assume is first line in script or function
let obj = {
p: 5,
get p() {
console.log("in getter");
},
set p(v) {
console.log("in setter: ", v);
}
};
我在这里问有几个原因:
-
- 我很难找到一种运行 ES6 之前(即 ES5)JavaScript 的方法。(例如,我在这里检查了一下,甚至像浏览器这样的东西也可能混合匹配 ECMAScript 标准。
-
- 从 ES6 开始,重复的属性名称不是错误(请参阅此处)。
-
- 我在 ES6 中玩过属性以及同名的 getter 和 setter 的顺序,它们的顺序似乎很重要。(我知道随后定义的属性现在将是那些使用相同名称的属性,但是将属性放在同名的 getter 之后但放在同名的 setter 之前会导致访问该属性的计算结果始终为 ,(即使是,我使用的 getter 也被编码为返回非值, 例如 )。前任:
undefined
undefined
6
- 我在 ES6 中玩过属性以及同名的 getter 和 setter 的顺序,它们的顺序似乎很重要。(我知道随后定义的属性现在将是那些使用相同名称的属性,但是将属性放在同名的 getter 之后但放在同名的 setter 之前会导致访问该属性的计算结果始终为 ,(即使是,我使用的 getter 也被编码为返回非值, 例如 )。前任:
//Ex 1:
let obj = {
get p() {
console.log("in getter");
return 6;
},
p: 5,
};
console.log(obj.p); //prints 5
//Ex 2:
let obj2 = {
get p() {
console.log("in getter");
return 6;
},
p: 5,
set p(v) {
console.log("in setter: ", v);
}
};
console.log(obj2.p); //prints undefined
答:
1赞
jagmitg
7/23/2023
#1
在 JS 中,您不能真正拥有具有相同命名约定的 get/set 和 data 属性。它们几乎在对象上占据相同的插槽。
在 ES5 和严格模式下,如果定义一个数据属性,然后定义一个同名的 getter/setter,反之亦然,则将覆盖前一个属性。这正是您的示例中发生的情况。
以下是严格使用的
正确用法:
"use strict";
let obj = {
_p: 5, //use a different internal property to store the value
get p() {
console.log("in getter");
return this._p;
},
set p(v) {
console.log("in setter: ", v);
this._p = v;
}
};
console.log(obj.p); //logs "in getter", then 5
obj.p = 10; //logs "in setter: 10"
console.log(obj.p); //logs "in getter", then 10
关于第二个示例,首先定义 get,然后返回一个 const 值。然后,定义一个数据属性,该属性将覆盖 get。最后,将覆盖数据属性的集合。结果,getter 消失了,尝试访问将未定义。6
p
obj2.p
评论
0赞
mishar
7/23/2023
好的,谢谢;所以似乎即使是 ES5 也不会抛出错误(如果它们与我的第一个示例相同)?我只是认为 ES5 会在严格模式下出现重复属性名称的情况下抛出错误,该错误具有 getter/setter 和我也认为会触发的相同值的属性?
0赞
jagmitg
7/23/2023
@mishar 在 ES5 和 ES6 中,定义一个数据属性,然后在同一对象文本中定义一个具有相同名称的 get/set,反之亦然,即使在严格模式下也不会触发错误。它只是简单地覆盖了前一个。JS 允许这样做,但它可能会令人困惑,并且经常导致意外行为,这就是您正在观察到的。
评论