Javascript单例继承

Javascript单例继承,javascript,oop,inheritance,singleton,Javascript,Oop,Inheritance,Singleton,我想保留一个单亲班级。所有继承父类的clild类都将能够共享同一父类对象。如何做到这一点 var ParentClass = function(){ this.a = null; } ParentClass.prototype.setA = function(inp){ this.a = inp; } ParentClass.prototype.getA = function(){ console.log("get a "+this.a); } // Clild C

我想保留一个单亲班级。所有继承父类的clild类都将能够共享同一父类对象。如何做到这一点

var ParentClass = function(){
    this.a = null;
}

ParentClass.prototype.setA = function(inp){
    this.a = inp;
}

ParentClass.prototype.getA = function(){
    console.log("get a "+this.a);
}

// Clild Class

var ClassB = function(){}

ClassB.prototype = Object.create(ParentClass.prototype);

var b = new ClassB();
b.setA(10);
b.getA(); //it will return 10


//Another clild Class
var ClassC = function(){}

ClassC.prototype = Object.create(ParentClass.prototype);
var c = new ClassC();
c.getA(); //I want 10 here.

我理解,对于第二个clild类,父类正在再次实例化,这就是我无法访问旧对象的原因。如何在Javascript中实现这种单例继承?有什么想法吗?

当您从任何实例调用
getA
时,其中
this
的值将指向实例本身。如果将setter代码更改为以下内容,则可以实现所需的目标:

ParentClass.prototype.setA = function(inp){
    ParentClass.prototype.a = inp;
}

请注意,从父类实例调用
getA
将返回
null
,构造函数定义自己的属性
a
,该属性将从原型中隐藏该属性。

将此类静态值放在其他地方
是当前实例,您不希望在其中创建新属性。选择包括:

  • ParentClass.prototype
    (如@bfavareto所示),这将导致所有实例继承并能够覆盖它
  • 作用域变量(基本上实现显示模块模式):

  • 父类
    函数对象本身:

    ParentClass.prototype.setA = function(inp){
        ParentClass.a = inp;
    };
    ParentClass.prototype.getA = function(){
        console.log("get a "+ParentClass.a);
        return ParentClass.a;
    };
    

我认为你可以从你的问题中省去所有遗产。如果
b
c
ParentClass
的实例,那么单例模式目前甚至不起作用。
ParentClass.prototype.setA = function(inp){
    ParentClass.a = inp;
};
ParentClass.prototype.getA = function(){
    console.log("get a "+ParentClass.a);
    return ParentClass.a;
};