【问题标题】:how to define a static property in the ES6 classes [duplicate]如何在 ES6 类中定义静态属性 [重复]
【发布时间】:2018-06-09 07:23:09
【问题描述】:

我想在 ES6 类中拥有一个静态属性。该属性值最初是一个空数组。

    class Game{

        constructor(){
           // this.cards = [];
        }

        static cards = [];
    }
    
    Game.cards.push(1);

    console.log(Game.cards);

我该怎么做?

【问题讨论】:

  • 这不是有效的 ES6 语法。
  • 如果需要检索一些常量并且不需要来自同一个类,那么导出对象的模块就足够了。例如:module.exports = { AppConstants: { SOME_CONSTANT: value } }; 并使用,只需将其导入为const { AppConstants } = require('../path/to/AppConstants'); 并调用代码为AppConstants.SOME_CONSTANT;
  • 在 2021 年,您可以像以前一样声明静态属性。您的代码 sn-p 现在可以正常工作了! (caniuse.com/?search=class%20fields)。

标签: javascript ecmascript-6 static es6-class


【解决方案1】:
class Game{
   constructor(){}
}
Game.cards = [];

Game.cards.push(1);
console.log(Game.cards);

你可以像这样定义一个静态变量。

【讨论】:

  • 感谢您的信息,但是在类本身内没有为该类创建静态变量的概念吗?看到属性浮动在类之外的某个地方很奇怪,我知道在 Java 中你可以简单地创建一个静态类变量......这在 javascript 中还不可能吗?
  • @user2774480 Game.cards = [] 部分完全符合您的要求。在类声明中没有语法可做。
【解决方案2】:

一种方法可能是这样的:

let _cards = [];
class Game{
    static get cards() { return _cards; }
}

那么你可以这样做:

Game.cards.push(1);
console.log(Game.cards);

您可以在discussion 中找到一些关于在 es6 中包含静态属性的有用点。

【讨论】:

  • 注意事项(可能有帮助或有害):使用这样的 getter 在功能上与下面的 zarnifoulette 之类的答案不同,因为 getter 允许您访问和修改类的“静态属性” (即使它们在技术上不是类的属性,而是在类旁边定义的闭包的值)即使在使用诸如 Object.freeze() 之类的东西来非正式地防止对类的进一步修改之后结构/属性/键。
  • 以这种方式在全局范围内定义变量是一个非常糟糕和危险的想法。尽管在@zagoa 的回答中,变量声明在类定义之外,但它的范围是 Game 类(注意不是实例或原型,而是类本身),这实际上是一个静态属性。在他的回答中,您还可以在 Game 类中添加这种静态 getter 方法,但它不会为其添加任何额外的功能。请注意,每 200 毫秒会重新计算一次吸气剂,这将是有害的。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 2016-11-16
  • 2013-08-17
  • 2017-10-20
  • 2011-04-21
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多