JavaScript getter 定义为数组而不是函数?

JavaScript getter defined as an array instead of a function?

我无法将以下内容与我阅读过的任何 JavaScript 文档进行核对。有人可以解释一下吗?

以下片段摘自 file panelUI.js in the Mozilla repository

const PanelUI = {
  /** Panel events that we listen for. **/
  get kEvents() ["popupshowing", "popupshown", "popuphiding", "popuphidden"],

  // more properties...

  _addEventListeners: function() {
    for (let event of this.kEvents) {
      this.panel.addEventListener(event, this);
    }
    // more code...
  },

  // more properties...

我读到的关于 JS 的所有内容都将 getter 定义为本质上是一个函数(或“一种获取特定 属性 值的方法”和“get 语法将对象 属性 绑定到一个函数,该函数将在查找 属性 时调用 ”),所以我有点困惑地看到一个数组文字,我希望在其中找到函数的主体 kEvents().

在 JS 中函数名后跟数组字面值(通常或作为 get 定义的一部分)是什么意思?

您将如何编写功能上与上述代码等效但不使用这种奇怪语法的代码?

这在任何方面都是无效的JavaScript...除非 Firefox 出于某种原因允许它作为替代语法。

但是,如果您尝试 运行 在 chrome 等浏览器中使用此代码或类似代码,甚至尝试使用 Babel 和 ES6 编译它,都会失败。

我认为这是 SpiderMonkey 对 expression closures.

的非标准和弃用支持的结果

How would you write code that is functionally equivalent to the above, but does not use this somehow odd syntax?

"equivalent" 语法似乎是将数据包裹在花括号中,return 它:

get kEvents() {
    return ["popupshowing", "popupshown", "popuphiding", "popuphidden"];
},

我猜测示例代码 return 每次都是同一个数组实例,而我的代码每次调用时都会生成一个新数组。

我想列出的行是 mozilla 实现的非标准语法,但与任何当前规范无关。浏览器开发社区通常会通过这些功能推动浏览器实现一项新功能,以查看它是否值得标准化。它可能是一个提议的语法,后来也被删除了

综上所述,这是推测性的,因为我从未见过其中包含该语法的标准。