如何在以下情况下实现单例模式?

时间:2018-06-06 05:22:32

标签: javascript ecmascript-6

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。

我想在单个实现中为三个类 Parent Child Child2 中的每一个实现。但是当我在其他类之前实例化 Parent 类时,会出现问题。

我试图提出好主意,但失败了。有什么办法可以解决吗?

test URL

1 个答案:

答案 0 :(得分:2)

Class[instance]在整个原型(继承)链中查找instance。因此,如果是Child2,则以Child2开头,如果没有属性,则会继续Parent,然后是Object。结果是,当您想要创建Parent的实例时,您将返回Child2的实例。

您应该使用hasOwnProperty()

,而不是使用查找检查属性是否存在
if (!Class.hasOwnProperty(instance)) Class[instance] = this;

这意味着如果Child2本身(!)没有实例,则为其分配一个实例。