JavaScript:重复的属性名称和 getter/setter 在 ES5 中出现错误?

JavaScript: duplicate property name and getter/setter an error in ES5?

提问人:mishar 提问时间:7/23/2023 更新时间:7/23/2023 访问量:56

问:

这里的 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);
      }
    };

我在这里问有几个原因:

    1. 我很难找到一种运行 ES6 之前(即 ES5)JavaScript 的方法。(例如,我在这里检查了一下,甚至像浏览器这样的东西也可能混合匹配 ECMAScript 标准。
    1. 从 ES6 开始,重复的属性名称不是错误(请参阅此处)。
    1. 我在 ES6 中玩过属性以及同名的 getter 和 setter 的顺序,它们的顺序似乎很重要。(我知道随后定义的属性现在将是那些使用相同名称的属性,但是将属性放在同名的 getter 之后但放在同名的 setter 之前会导致访问该属性的计算结果始终为 ,(即使是,我使用的 getter 也被编码为返回非值, 例如 )。前任:undefinedundefined6
    //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
JavaScript 属性 重复 ecmascript-5 use-strict

评论


答:

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 消失了,尝试访问将未定义。6pobj2.p

评论

0赞 mishar 7/23/2023
好的,谢谢;所以似乎即使是 ES5 也不会抛出错误(如果它们与我的第一个示例相同)?我只是认为 ES5 会在严格模式下出现重复属性名称的情况下抛出错误,该错误具有 getter/setter 和我也认为会触发的相同值的属性?
0赞 jagmitg 7/23/2023
@mishar 在 ES5 和 ES6 中,定义一个数据属性,然后在同一对象文本中定义一个具有相同名称的 get/set,反之亦然,即使在严格模式下也不会触发错误。它只是简单地覆盖了前一个。JS 允许这样做,但它可能会令人困惑,并且经常导致意外行为,这就是您正在观察到的。