2012-08-15 11 views
6

Qualcuno può spiegarmi questo comportamento. Consente dichiarare una classe:Comportamento ereditario 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); 
    } 
}); 

Ora creo due oggetti

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

testare la proprietà

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

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

Emette

1 
2 

Tutto è OK, ma

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

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

otteniamo

[1,2] 
[1,2] 

Questo non capisco. Perché utilizza proprietà "a" separate ma una sola matrice "ar" per entrambi gli oggetti. "ar" non è dichiarato come statico! Non capisco affatto.

risposta

8

Quando si inserisce qualcosa nella dichiarazione della classe, significa che viene inserito nel prototipo dell'oggetto (leggi: viene condiviso in tutte le istanze). Non è davvero un problema per stringhe/numeri/bool, ma per gli oggetti e gli array vedrai questo comportamento entrare in vigore.

Se si vuole avere una matrice/struttura per esempio, allora è necessario aggiungere esplicitamente nell'istanza:

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

Grazie, puoi chiarire perché funziona in modo diverso con stringhe/numeri/bool – mik

+0

Non fa alcuna distinzione, è solo che gli array/oggetti sono tipi di "riferimento". –

+1

stringhe/numeri/bool sono tipi di dati immutabili. L'unico modo per manipolare il valore è riassegnare un nuovo valore alla proprietà rilevante, che nella maggior parte dei casi applicherà il nuovo valore come membro dell'istanza specifica ('this.a =" mystring "'). Il prototipo (condiviso) rimarrà intatto. – mistaecko

3

Questo perché di questo bit qui:

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

Per rendere più chiaro, il codice sopra è equivalente a:

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

Quindi entrambi gli oggetti condividono lo stesso array perché Il costruttore di oggetti e copia solo il riferimento alla matrice, non l'intero oggetto dell'array.

Non

sicuro di come Ext.js gestisce costruttori/initializers ma è necessario creare l'array durante la costruzione oggetto non quando si dichiara che ....

OK, Googling mi ha dato questo:

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

Questo dovrebbe risolvere il tuo problema.