2012-08-15 79 views
6

有人可以向我解釋這種行爲。 讓我們聲明一個類: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); 
    } 
}); 

現在,我創建了兩個對象

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

測試

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

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

此輸出

1 
2 

一切都OK了財產,但

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

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

我們得到

[1,2] 
[1,2] 

這個我不明白。爲什麼它爲兩個對象使用單獨的「a」屬性,而使用一個「ar」數組。 「ar」未被聲明爲靜態! 我不明白。

回答

8

當你在類聲明中放入某些東西時,它意味着它被推送到對象原型上(讀取:它在所有實例中共享)。對於strings/numbers/bools來說這不是問題,但是對於對象和數組,您會看到這種行爲已經生效。

如果你想有每個實例的數組/對象,那麼你需要的情況下明確添加:

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

謝謝,請你澄清爲什麼它的作用與字符串/數字/布爾不同 – mik 2012-08-15 07:17:39

+0

它沒有任何區別,它只是數組/對象是「引用」類型。 – 2012-08-15 07:19:50

+1

字符串/數字/布爾是不可變的數據類型。操縱該值的唯一方法是將新值重新分配給相關屬性,在大多數情況下,該值將應用新值作爲特定實例('this.a =「mystring」')的成員。原型(共享)將保持不變。 – mistaecko 2012-08-15 07:40:58

3

這是因爲該位在這裏:

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

要使它更清晰,上面的代碼相當於:

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

因此,兩個對象共享相同的數組,因爲th e對象構造函數只將引用複製到數組而不是完整的數組對象。

不知道Ext.js如何處理構造函數/初始化,但你需要創建對象施工過程中的數組不能在聲明它....

OK,谷歌搜索給了我這個:

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

這應該可以解決你的問題。