-1

我試圖寫一個陣列上的包裝,我想出了下面的代碼:JavaScript初始化對象屬性?

myList = function() { }; 
myList.prototype.innerArray = []; 
myList.prototype.add = function(pt) { this.innerArray.push (pt); return this; }; 

對於每一個對象myList中我創造,我希望得到一個空的屬性innerArray。但恐怕我還沒有真正理解原型的概念,但因爲:

m = new myList().add(4).add(5); 
m.innerArray.length; 

回報2,到目前爲止好,但現在我做:

j = new myList(); 
j.innerArray.length; 

也返回2 ,我會期待0(一個新的新的innerArray);恐怕我錯過了一些基本的東西。

回答

1

myList的所有實例共享完全相同的原型對象。它不會複製或克隆到每個實例。對於函數來說這很好,因爲當你調用foo.add()時,this就是實例,允許你獲取每個實例的值。 foo.addbar.add是相同的功能對象,但this在每次調用中都不相同。但是,當你改變它們時,直接在原型上的值會改變爲所有實例,因爲它們都指向相同的對象。

相反,你想在構造一個新的數組:

myList = function() { 
    this.innerArray = []; 
}; 
myList.prototype.add = function(pt) { 
    this.innerArray.push (pt); 
    return this; 
}; 
2

你不想在innerArray中使用原型。在你的構造函數中簡單地做this.innerArray = [],現在你有一個實例變量。通過使用原型,您正在創建類屬性(例如,在類實例之間共享),而不是實例變量(例如,對類的實例唯一的)。

1

你應該做

myList = function() { this.innerArray = []; }; 

就象這樣:

myList.prototype.innerArray = []; 

創建innerArray變量適用於所有情況。