Static II

Los atributos estáticos heredados de una clase reciben el valor de estos cuando fueron declarados, es decir, si modificamos el valor de un atributo estático de la superclase, el valor del atributo en la subclase no se modifica y viceversa.


function ClassA(){

	this.$$DEFINE_STATIC = function(){
		this.$$static.instances = [];
	};
	this.$$constructor = function(msg){
		this.$$static.instances.push(this);
	};

};

var ClassA = Class.create("ClassA",ClassA);

var inst1A = new ClassA();
var inst2A = new ClassA();

alert(ClassA.$$static.instances.length);// 2

var ClassB = Class.extend("ClassB",ClassA,function(){
	this.$$constructor = this.$$super[0].$$constructor;
});

var inst1B =  new ClassB();

alert(ClassB.$$static.instances.length);//1
alert(ClassA.$$static.instances.length);// 2

Si por ejemplo quisiéramos que la superclase ClassA también guarde todas las instancias creadas por la subclase ClassB, podemos utilizar $$super.


function ClassA(){

	this.$$DEFINE_STATIC = function(){
		this.$$static.instances = [];
		this.$$static.addInstance = function(){
			//Si $$super existe es que es una subclase
			// almacenamos la instancia en también en la superclase
			if(this.$$super) this.$$super[0].$$static.instances.push(this);
			//añadimos la instancia a la clase 
			this.$$static.instances.push(this);
		};
	};
	
	this.$$constructor = function(msg){
		 this.$$static.addInstance(this);
	};

};

var ClassA = Class.create("ClassA",ClassA);

var inst1A = new ClassA();
var inst2A = new ClassA();

alert(ClassA.$$static.instances.length);// 2

var ClassB = Class.extend("ClassB",ClassA,function(){
	this.$$constructor = this.$$super[0].$$constructor;
});

var inst1B = new ClassB();
alert(ClassB.$$static.instances.length);//1
alert(ClassA.$$static.instances.length);// 3

Esto es de gran utilidad, ya que no permite tener un mayor control sobre todas las instancias que creamos.
Si en el atributo estático instances de ClassA almacenamos todas las instancias creadas tanto por ClassA como por sus subclases, cómo puede saber a que clase pertenece una instancia sí están entremezcladas.
Para solucionar este problema cada instancia tiene la propiedad $$class, que referencia a la clase.


function ClassA(){

	this.$$DEFINE_STATIC = function(){
		this.$$static.instances = [];
		this.$$static.addInstance = function(){
			//Comprobamos en que punto de la jerarquía nos encontramos
			//si  es cero no encontramos en la superclase ClassA
			if(Class.getIndex(this)!= 0) this.$$super[0].$$static.instances.push(this);		
			this.$$static.instances.push(this);
		};
		this.$$static.getIntancesOf = function(klass){
			//obtenemos el atributo instance de ClassA
			var instances = this.$$super ? this.$$super[0].$$static.instances : this.$$static.instances;	
			var result = [];
			for(var ctr= 0; ctr < instances.length;ctr++){
				// si la intancia fue creada por la clase 
				if(instances[ctr].$$class  === klass) result.push(instances[ctr]);
			} 
			return result;
		};
	};
	
	this.$$constructor = function(msg){
		this.$$static.addInstance(this);
	};

};

var ClassA = Class.create("ClassA",ClassA);

var inst1A = new ClassA();
var inst2A = new ClassA();


var ClassB = Class.extend("ClassB",ClassA,function(){
	this.$$constructor = this.$$super[0].$$constructor;
});

var inst1B = new ClassB();

alert(ClassA.$$static.getIntancesOf(ClassB).length);// 1
alert(ClassB.$$static.getIntancesOf(ClassA).length);// 2

También es posible saber a que clase pertenece mediante el nombre de la clase mediante la propiedad $$className, aunque es preferible utilizar siempre $$class.


function ClassA(){

	this.$$DEFINE_STATIC = function(){
		this.$$static.instances = [];
		this.$$static.addInstance = function(){
			if(this.$$super) this.$$super[0].$$static.instances.push(this);
			this.$$static.instances.push(this);
		};
		this.$$static.getIntancesOf = function(name){
			//obtenemos el atributo instance de ClassA
			var instances = ClassA.$$static.instances;	
			var result = [];
			for(var ctr= 0; ctr < instances.length;ctr++){
				// si la intancia fue creada por la clase 
				if(instances[ctr].$$className  === name) result.push(instances[ctr]);
			} 
			return result;
		};
	};
	
	this.$$constructor = function(msg){
		this.$$static.addInstance(this);
	};

};

var ClassA = Class.create("ClassA",ClassA);

var inst1A = new ClassA();
var inst2A = new ClassA();


var ClassB = Class.extend("ClassB",ClassA,function(){
	this.$$constructor = this.$$super[0].$$constructor;
});

var inst1B = new ClassB();

alert(ClassA.$$static.getIntancesOf("ClassB").length);// 1
alert(ClassB.$$static.getIntancesOf("ClassA").length);// 2