JavaScript多态性: how to access static attributes of inheriting class in static method of ("abstract") base class?

标签 javascript inheritance

我想要一个基类和一个继承类。基类应该提供一些通用功能,这些功能取决于继承类的属性。

=>如何访问基类中继承类的属性?

下面是一些示例来说明问题(我的问题不是如何在 JavaScript 中定义枚举。该示例仅用于说明。)。

基类示例:

export default class Enum { 

    constructor(name){
        this.name = name;       
    }
}

Enum.values =  function(){
    return Object.values(INHERITING_CLASS);
};


Enum.forName = function(name){
    for(var enumValue of INHERITING_CLASS.values){
        if(enumValue.name === name){
            return enumValue;
        }
    }
    throw new Error('Unknown value "' + name + '"');
} 

继承类示例:

import Enum from './enum.js';

export default class ColumnType extends Enum {  

    constructor(name, clazz){
        super(name);        
        this.associatedClass = clazz;
    }
}

ColumnType.Integer = new ColumnType('Integer', Number);
ColumnType.Double = new ColumnType('Double', Number);
ColumnType.String = new ColumnType('String', String);

我希望能够访问 ColumnType 的静态值

ColumnType.values()

其中values函数由基类Enum提供。一些用于方法 forName

如果我使用“Enum”作为占位符 INHERITING_CLASS,结果不正确。

=> 我如何知道 ColumnType 是当前的继承类,同时又在 Enum 类的定义范围内?

编辑

这是一个相关问题:

Get parent class name from child with ES6?

他们的答案使用instance.constructor。但是,在我的静态方法中,我没有实例。

最佳答案

这比我想象的要容易。当调用静态方法ColumnType.values()时,值函数this内部实际上会提供所需的类作为上下文:

export default class Enum { 

    constructor(name){
        this.name = name;       
    }
}

Enum.values =  function(){
    return Object.values(this);
};


Enum.forName = function(name){
    for(var enumValue of this.values){
        if(enumValue.name === name){
            return enumValue;
        }
    }
    throw new Error('Unknown value "' + name + '"');
} 

关于JavaScript多态性: how to access static attributes of inheriting class in static method of ("abstract") base class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55141718/

相关文章:

c++ - static_assert 向上转换是否需要调整指针

java - 是否可以创建一个与 Java 中特定隐藏 api 接口(interface)兼容的接口(interface)?

javascript - 在 typescript Angular 2中创建对象实例

javascript - 从上到下在页面中间居中网站

java - 是否可以在 Java 的方法中使用交替条件?

java - 如何扩展列表中包含的对象?

c++ - 模板类中嵌套类的问题

javascript - Selenium 测试中的 Facebook 登录

javascript - 无法在 superslides jquery 插件上加载 ajax 内容

javascript - 无效状态错误 : "An attempt was made to use an object that is not, or is no longer, usable" in basic Google Map tutorial example