【问题标题】:How to implement static members (non-function) on javascript CLASSES (ES6) [duplicate]如何在javascript CLASSES(ES6)上实现静态成员(非功能)[重复]
【发布时间】:2018-08-02 07:03:49
【问题描述】:

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

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 ^^ 

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

【问题讨论】:

    标签: javascript class ecmascript-6


    【解决方案1】:

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

    class UserActionsService {
    
        static get actionTypes() {
          return {
            foo: 1,
            bar: 2,
            buzz: 3
           };
        }
    
        static doSomethingWith(actionType) {
            console.log(actionType);
        }
    }
    
    UserActionsService.doSomethingWith(UserActionsService.actionTypes.buzz);

    【讨论】:

    • "您的代码应该按原样工作" 当然不是。它在语法上无效,因为不支持属性。
    • 你是对的,我错误地认为他正在使用诸如 Babel 之类的编译器,它可以让你这样做。已编辑答案,感谢您的输入。
    【解决方案2】:

    如果您使用模块,您可以将“枚举”设为普通对象,与静态函数处于同一级别,并将两者都导出为模块的属性:

    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 所评论的)支持的语法。

    【讨论】:

    • 我更新了问题的标题,我使用的是类,而不是模块...不过还是谢谢!
    猜你喜欢
    • 2017-05-18
    • 2012-07-24
    • 2011-05-31
    • 1970-01-01
    • 2023-03-17
    • 2012-10-20
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多