Как реализовать шаблон синглтона в следующей ситуации? - PullRequest
0 голосов
/ 06 июня 2018
const instance = Symbol('instance');

class Parent {
    number;

    constructor() {
        const Class = this.constructor;

        if (!Class[instance]) Class[instance] = this;
        return Class[instance];
    }

    set_number (number) {
        this.number = number;
    }
}

class Child extends Parent {
    test () { }
}

class Child2 extends Parent {
    test () { }
}

const child = new Child();
const parent = new Parent();
const child2 = new Child2();

child.set_number(1);
child.test();

child2.set_number(2);
child2.test(); // child2.test is not a function

parent.set_number(3);

console.log(child.number); // output : 1
console.log(child2.number); // output : 3 (I want it to be 2.)
console.log(parent.number); // output : 3

Я внедрил Singleton, назначив экземпляры конструктору.

Я хочу быть реализован в Singleton для каждого из трех классов Parent , Child и Child2 .Но есть проблема, когда я создаю экземпляр класса Parent перед другими классами.

Я попытался придумать хорошую идею, но потерпел неудачу.Можно ли как-то решить эту проблему?

тестовый URL

1 Ответ

0 голосов
/ 06 июня 2018

Class[instance] ищет instance по всей цепочке прототипов (наследования).Таким образом, в случае Child2 оно начинается с Child2, а если свойства отсутствуют, оно продолжается с Parent, а затем Object.В результате вы возвращаете экземпляр Parent, когда хотите создать экземпляр Child2.

Вместо проверки существования свойства с помощью поиска, вы должны использовать hasOwnProperty():

if (!Class.hasOwnProperty(instance)) Class[instance] = this;

Это означает, что если у самого Child2 (!) Нет экземпляра, назначьте его ему.

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