首页 > 解决方案 > Javascript多态性:如何在(“抽象”)基类的静态方法中访问继承类的静态属性?

问题描述

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

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

下面是一些示例来说明问题(我的问题不是如何在 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

如果我将“枚举”用于占位符 INHERITING_CLASS,则结果不正确。

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

编辑

这是一个相关的问题:

使用 ES6 从子级获取父类名称?

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

标签: javascriptinheritance

解决方案


这比我想象的要容易。调用静态方法ColumnType.values()时,在 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 + '"');
} 

推荐阅读