Javascript 单例继承

Javascript singleton inheritance

本文关键字:继承 单例 Javascript      更新时间:2023-09-26

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

把这样的静态值放在别的地方。 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;
    };
    

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

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

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