如何在javascript CLASSES(ES6)上实现静态成员(非函数)

时间:2018-02-22 12:19:04

标签: javascript class ecmascript-6

我有一个只包含静态方法的类,并且不需要实例化它。我希望这个类用静态值包装一个“枚举”,由这个类下的静态方法使用。以下是此用例的简化示例,因为我“想要”它看起来像:

class UserActionsService {

    static actionTypes = {
        foo: 1,
        bar: 2,
        buzz: 3
    };

    static doSomethingWith(actionType) {
        console.log(actoinType);
    }
}

,用法应该如下:

UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);

但是,由于我无法使静态actionTypes成员工作,我用一个静态函数包装它,如下所示:

class UserActionsService {

    static actionTypes() {
        return {
            foo: 1,
            bar: 2,
            buzz: 3
        };
    }

    static doSomethingWith(actionType) {
        console.log(actoinType);
    }
}

并像这样使用它:

UserActionsService.doSomethingWith(UserActionsService.actionTypes().buzz);
///////////////////////////////////////////////// Ugly part here ^^ 

它有效,但很难看。我错过了什么吗?是否存在仅使静态方法可用而不是静态成员的特定原因?

2 个答案:

答案 0 :(得分:2)

您可以使用 getter 来绕过“丑陋”的语法

class UserActionsService {

    static get actionTypes() {
      return {
        foo: 1,
        bar: 2,
        buzz: 3
       };
    }

    static doSomethingWith(actionType) {
        console.log(actionType);
    }
}

UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);

答案 1 :(得分:1)

如果您正在使用模块,您可以将'enum'设置为与静态函数处于同一级别的普通对象,并将它们导出为模块的属性:

UserActionsService.js

const actionTypes = {
  foo: 1,
  bar: 2,
  buzz: 3
}

function doSomethingWith(actionType){
   do the thing...
}

module.exports = {actionTypes, doSomethingWith};

消费模块

const UserActionsService = require('./UserActionsService');
UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);

在这种情况下,ES6'类'确实是语法糖,并没有提供这种简单结构无法提供的任何内容。

至于为什么你不能做你最初尝试做的事情,它不是(由dsfq评论)支持的语法。