如何在ES6类中定义静态属性

46

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

    class Game{

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

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

    console.log(Game.cards);

我该怎么做?


https://jsfiddle.net/03xnguf6/ - Hackerman
这不是有效的ES6语法。 - Bergi
如果需要检索一些常量,而不需要来自同一类的常量,则导出对象的模块就足够了。例如:module.exports = { AppConstants: { SOME_CONSTANT: value } }; 使用时,只需将其导入为 const { AppConstants } = require('../path/to/AppConstants'); 并在代码中调用 AppConstants.SOME_CONSTANT; - VPaul
1
2021年,您可以像以前一样声明静态属性。您的代码片段现在可以正常工作了!(https://caniuse.com/?search=class%20fields) - maxime schoeni
2个回答

58
class Game{
   constructor(){}
}
Game.cards = [];

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

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


8
谢谢提供信息,但是否有一种概念可以在类内部创建一个静态变量?看到属性漂浮在类外面感觉很奇怪,在Java中只需要创建一个静态类变量就行了......这在JavaScript中不可能吗? - MMMM
3
@user2774480,“Game.cards = []”部分恰好实现了您想要的功能。类声明内部没有其他语法需要处理。 - pishpish

53

有一种做法可以像这样:

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

然后您可以执行:

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

在这个讨论中,你可以找到关于如何在ES6中包含静态属性的一些有用的观点。


1
需要注意的事项(有利或有害):像这样使用getter在功能上与zarnifoulette以下的答案有所不同,因为getter允许您访问和修改类的“静态属性”(尽管它们从技术上讲并不是*类的属性,而是在类旁定义的闭包的值),甚至在使用Object.freeze()之类的东西来非正式地防止进一步修改类结构/属性/键之后。 - iono
1
在全局范围内这样定义变量是一个非常糟糕和危险的想法。虽然在 @zagoa 的答案中,变量声明在类定义之外,但其作用域是 Game 类(注意不是实例或原型,而是类本身),这意味着它真正是一个静态属性。在他的答案中,你也可以在 Game 类中添加这种静态 getter 方法,但它并没有增加任何额外的功能。请注意,getter 每 200 毫秒重新计算一次,这将是有害的。 - ConductedClever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接