Полиморфизм Javascript: как получить доступ к статическим атрибутам наследуемого класса в статическом методе («абстрактного») базового класса? - PullRequest
1 голос
/ 13 марта 2019

Я хотел бы иметь базовый класс и класс наследования.Базовый класс должен обеспечивать некоторые общие функциональные возможности, которые зависят от свойств наследующего класса.

=> Как получить доступ к свойствам наследующего класса в базовом классе?

Ниже приведены некоторыеПример для иллюстрации вопроса (Мой вопрос не в том, как определить перечисление в 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?

Редактировать

Вот связанный вопрос:

Получить имя родительского класса от child с ES6?

Их ответ использует instance.constructor.Однако в моем статическом методе у меня нет экземпляра.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Это проще, чем я думал. При вызове статического метода 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 + '"');
} 
0 голосов
/ 13 марта 2019

Я думаю, что вы ищете прототип, если я не прочитал вопрос

ColumnType.prototype.values ​​()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...