2012-08-15 12 views
6

Czy ktoś może wyjaśnić mi to zachowanie. Pozwala zadeklarować klasę:Zachowanie dziedziczenia 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); 
    } 
}); 

Teraz tworzę dwa obiekty

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

przetestować nieruchomość

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

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

ten wyprowadza

1 
2 

Wszystko jest OK, ale

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

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

Dostajemy

[1,2] 
[1,2] 

to ja nie rozumiem. Dlaczego używa dwóch oddzielnych właściwości "a", ale jednej "ar" dla obu obiektów. "ar" nie jest zadeklarowane jako statyczne! Nie rozumiem.

Odpowiedz

8

Po umieszczeniu czegoś w deklaracji klasy, oznacza to, że zostanie ona wypchnięta na prototyp obiektu (czytaj: zostanie udostępniony we wszystkich instancjach). Nie stanowi to problemu dla łańcuchów/liczb/boolów, ale w przypadku obiektów i tablic widać, że to zachowanie działa.

Jeśli chcesz mieć tablicę/przedmiot za przykład, to trzeba wyraźnie dodać ją w instancji:

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

Dziękuję, czy możesz wyjaśnić, dlaczego działa on inaczej, niż łańcuchy/liczby/boolki? – mik

+0

Nie czyni żadnego rozróżnienia, tylko że tablice/obiekty są typami "referencyjnymi". –

+1

łańcuchy/liczby/boole są niezmiennymi typami danych. Jedynym sposobem manipulowania wartością jest ponowne przypisanie nowej wartości do odpowiedniej właściwości, która w większości przypadków zastosuje nową wartość jako element konkretnej instancji ('this.a =" mystring "'). Prototyp (udostępniony) pozostanie nietknięty. – mistaecko

3

To dlatego, że tego bitu tutaj:

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

Aby jaśniej, powyższy kod jest równoważny z:

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

Tak więc oba obiekty mają tę samą tablicę, ponieważ Konstruktor obiektów tylko kopiuje odwołanie do tablicy, a nie do pełnego obiektu tablicy.

Nie wiem, jak Ext.js obsługuje konstruktorzy/inicjatorów ale trzeba utworzyć tablicę podczas budowy obiektu, jeśli nie objawi ....

OK, Googling dał mi tak:

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

To powinno rozwiązać twój problem.