Javascript单例继承

时间:2013-09-11 22:42:10

标签: 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 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中实现这个单例继承?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

将此类静态值放在其他位置。 this是当前实例,而不是您要创建新属性的位置。选择是:

  • ParentClass.prototype(正如@bfavaretto所示),这将导致所有实例继承并能够覆盖它
  • 一个范围变量(基本上实现了揭示模块模式):

    (function() {
        var a;
        ParentClass.prototype.setA = function(inp){
            a = inp;
        };
        ParentClass.prototype.getA = function(){
            console.log("get a "+a);
            return a;
        };
    }());
    
  • ParentClass函数对象本身:

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

答案 1 :(得分:1)

当您从任何实例调用getA时,其中this的值将指向实例本身。如果您将setter代码更改为:

,您可以实现您正在寻找的内容
ParentClass.prototype.setA = function(inp){
    ParentClass.prototype.a = inp;
}

请注意,从ParentClass实例调用getA将返回null,构造函数定义一个自己的属性a,它将隐藏原型中的属性。{/ p>