如何在 ES6 类中定义静态属性 [重复]

Posted

技术标签:

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

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

    class Game

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

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

    console.log(Game.cards);

我该怎么做?

【问题讨论】:

jsfiddle.net/03xnguf6 这不是有效的 ES6 语法。 如果需要检索一些常量并且不需要来自同一个类,那么导出对象的模块就足够了。例如:module.exports = AppConstants: SOME_CONSTANT: value ; 并使用,只需将其导入为const AppConstants = require('../path/to/AppConstants'); 并调用代码为AppConstants.SOME_CONSTANT; 在 2021 年,您可以像以前一样声明静态属性。您的代码 sn-p 现在可以正常工作了! (caniuse.com/?search=class%20fields)。 【参考方案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 毫秒会重新计算一次吸气剂,这将是有害的。

以上是关于如何在 ES6 类中定义静态属性 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ES6---class的静态方法静态属性和实例属性

ES6入门六:class的基本语法继承私有与静态属性修饰器

访问 TypeScript 中默认无名类中的静态属性

如何调用内部类中的静态方法

如何在 ES6 类中使用静态变量?

如何使用反射从静态类中获取静态属性