5

我想保留一个单亲类。所有继承父类的 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 中实现这种单例继承?任何想法?

4

2 回答 2

3

将这些静态值放在其他地方。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;
    };
    
于 2013-09-11T22:51:06.820 回答
1

当您getA从任何实例调用时,this它内部的值将指向实例本身。如果您将设置器代码更改为此,您可以实现您正在寻找的内容:

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

请注意,getA从 ParentClass 的实例调用将返回null,并且构造函数定义了一个自己的属性a,该属性将遮蔽原型中的那个。

于 2013-09-11T22:45:38.660 回答