2012-08-15 18 views
6

¿Puede alguien explicarme este comportamiento? Permite declarar una clase:Comportamiento de herencia de ExtJs

Ext.define('baseClass',{ 
    a:null, 
    ar:[], 

    add:function(v) { 
     this.ar.push(v); 
    }, 
    sayAr:function() { 
     console.log(this.ar); 
    }, 

    setA:function(v) { 
     this.a= v; 
    }, 
    sayA:function() { 
     console.log(this.a); 
    } 
}); 

Ahora puedo crear dos objetos

var a = Ext.create('baseClass'); 
var b = Ext.create('baseClass'); 

prueba la propiedad

a.setA(1); 
b.setA(2); 

a.sayA(); 
b.sayA(); 

Esto da salida a

1 
2 

Todo está bien, pero

a.add(1); 
b.add(2); 

a.sayAr(); 
b.sayAr(); 

Nos obtener

[1,2] 
[1,2] 

Esto no entiendo. ¿Por qué usa propiedades separadas "a" pero una matriz "ar" para ambos objetos? "ar" no está declarado como estático! No lo entiendo en absoluto.

Respuesta

8

Cuando coloca algo en la declaración de clase, significa que se inserta en el prototipo del objeto (léase: se comparte en todas las instancias). En realidad, no es un problema para cadenas/números/bools, pero para objetos y matrices verá que este comportamiento entrará en vigencia.

Si usted quiere tener una matriz/objeto por ejemplo, entonces es necesario agregar explícitamente en la instancia:

Ext.define('baseClass',{ 
    a:null, 

    constructor: function(){ 
     this.ar = []; 
    } 

    add:function(v) { 
     this.ar.push(v); 
    }, 
    sayAr:function() { 
     console.log(this.ar); 
    }, 

    setA:function(v) { 
     this.a= v; 
    }, 
    sayA:function() { 
     console.log(this.a); 
    } 
}); 
+0

Gracias, pueden aclarar por qué funciona diferente con strings/numbers/bools – mik

+0

No hace ninguna distinción, es solo que las matrices/objetos son tipos de "referencia". –

+1

cadenas/números/bools son tipos de datos inmutables. La única forma de manipular el valor es volver a asignar un nuevo valor a la propiedad relevante, que en la mayoría de los casos aplicará el nuevo valor como miembro de la instancia específica ('this.a =" mystring "'). El prototipo (compartido) permanecerá intacto. – mistaecko

3

Eso es debido a esto poco aquí:

Ext.define('baseClass',{ 
    a:null, 
    ar:[], <--------------------------- you're instantiating an array object! 

Para hacer es más claro, el código anterior es equivalente a:

Ext.define('baseClass',{ 
    a:null, 
    ar:new Array(), 

Por lo tanto, ambos objetos comparten la misma matriz porque th El constructor de objetos solo copia la referencia a la matriz, no el objeto de la matriz completa.

No

seguro de cómo maneja Ext.js constructores/inicializadores pero se necesita para crear la matriz durante la construcción objeto no cuando se declara que ....

bien, buscar en Google me dio esto:

Ext.define('baseClass',{ 
    constructor: function() { 
     this.ar = []; 
    }, 

Eso debería resolver su problema.