Выполнить переопределенную статическую функцию из базового класса - PullRequest
0 голосов
/ 31 января 2019

Я хочу выполнить переопределенный статический метод из базового класса без создания экземпляра.

Я хочу использовать шаблон MVC в приложении, которое я создаю, и я создал класс с именем Model, которыйподключается к базе данных и получает объект, у него есть некоторые статические методы, которые я переопределяю, такие как имя таблицы (tableName).Проблема в том, что этот метод должен вызываться из статических методов.

Из базового класса все работает как шарм, проблема в том, что я использую другой класс, который расширяет базовый.

Воткод:

class Model {

    static get tableName() {
        return this.name;
    }

    static get primaryKey() {
        return "id";
    }

    static get columns() {
        return [];
    }

    static id(id) {
        return new Promise((resolve, reject) => {
            Model.get(Model.primaryKey, id)
            .then(models => {
                resolve(models[0]);
            });
        });
    }

    static get(columnName, value, compareSymbol) {
        return new Promise((resolve, reject) => {
            if (!compareSymbol) {
                compareSymbol = "=";
            }

            let sql = `select * from ${this.tableName}`,
            params = [];

            if (typeof columnName !== "undefined") {
                sql += ` where ${columnName} ${compareSymbol} ?`;
                params = [columnName, value];
            }

            console.log(sql, params);
        });
    }

    constructor(params) {
        this.target = new.target

        for (let name in params) {
            if (Model.primaryKey == name) {
                this[`#${name}`] = params[name];
            } else {
                this.set(name, params[name]);
            }
        }
    }

    set(name, value) {
        if (name != this.target.primaryKey && this.target.columns.indexOf(name) > -1) {
            this[`#${name}`] = value;
        }
    }

    get(name) {
        return this[`#${name}`];
    }

    executeSql(sql, variables) {
        console.log(sql, variables);
    }

    update() {
        let columns = this.target.columns.slice(),
        values = [],
        sql;

        sql = `update ${this.target.tableName} set ${columns.join("=?, ")}=? where ${this.target.primaryKey} = ${this.get(this.target.primaryKey)}`;

        for (let i = 0; i < columns.length; i++) {
            values.push(this.get(columns[i]));
        }

        return this.executeSql(sql, values);
    }
}

// from this line down is other different file

class Directory extends Model {
    static get tableName() {
        return "directories";
    }

    static get columns() {
        return [
            "name",
            "path",
            "recursive"
        ];
    }
}

// shows "from Model" expected "from directories"
Directory.id(2);

// work as expected
let d1 = new Directory({
    id: 1,
    name: "name",
    path: "path",
    recursive: false
});
d1.update();

Если вызывается без создания экземпляра, возвращается «Модель», есть ли способ получить переопределенное значение из базового класса?

...