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 类时,会出现问题。
我试图提出好主意,但失败了。有什么办法可以解决吗?
答案 0 :(得分:2)
Class[instance]
在整个原型(继承)链中查找instance
。因此,如果是Child2
,则以Child2
开头,如果没有属性,则会继续Parent
,然后是Object
。结果是,当您想要创建Parent
的实例时,您将返回Child2
的实例。
您应该使用hasOwnProperty()
:
if (!Class.hasOwnProperty(instance)) Class[instance] = this;
这意味着如果Child2
本身(!)没有实例,则为其分配一个实例。