2013-09-11 2 views
4

Я хотел бы сохранить один родительский класс. все классы clild, которые наследуют родительский класс, смогут совместно использовать один и тот же объект родительского класса. Как это можно достичь?Javascript singleton inheritance

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? Есть идеи?

+0

Я думаю, что вы можете оставить все наследство от своего вопроса. Шаблон singleton даже не работает в настоящее время, если 'b' и' c' были экземплярами 'ParentClass'. – Bergi

ответ

2

Поместите такие статические значения в другое место. this - текущий экземпляр, и это не то место, где вы хотите создать новое свойство. Варианты:

  • ParentClass.prototype (как продемонстрировано @bfavaretto), что приведет ко всем экземплярам наследования и возможность переписать его
  • в Scoped переменного (реализующий обнаруживающий шаблон модуля в основном):

    (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

Когда вы вызываете getA из любого экземпляра, значение this внутри него укажет на экземпляр. Вы можете добиться того, что вы ищете, если ваши изменения связующего код этого:

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

Обратите внимание, что вызов getA из экземпляра ParentClass вернется null, а конструктор определяет собственное свойство a, который в тени один из прототипа.