2011-02-16 20 views
1

我有一個奇怪的行爲,同時使用jQuery.extend擴展對象的原型。Javascript,jQuery.extend和「新」

假設此示例類:

var SampleClass = function (anArray) { this.Init(anArray); }; 

$.extend(SampleClass.prototype, { 

    array: null, 
    collection: new Array(), 

    Init: function (arr) { 
     var c = this; 
     c.array = arr; 
     c.insertInCollection(); 
    }, 

    insertInCollection: function() { 

     var c = this; 
     var l = c.array.length; 
     for (var i = 0; i < l; i++) { 
      var bar = {}; 
      c.collection.push(bar); 
     } 

     alert(c.collection.length); 
    } 
}); 

當我創建該對象的「c」中,收集得到的「insertInCollection」函數內部填充然後我執行此示例代碼

var arr1 = [{ name: 'foo', value: 20 }, { name: 'baz', value: 20}]; 
var arr2 = [{ name: 'bar', value: 60 }, { name: 'gaz', value: 40}]; 

c = new SampleClass(arr1); 
d = new SampleClass(arr2); //<-- HERE LIES THE PROBLEM 

,和警告返回長度爲2. 但是,當我實例化對象「d」(執行新的TestClass(arr2))時,「insertInCollection」函數內的警報被觸發,警報顯示4!

在實踐中,我無法得到背景中發生的事情。看起來像第一個集合的元素永遠不會被刪除 - 當第二個對象(「d」)被創建時,它已經在「collection」屬性中存在對象「c」的2個元素。

這也發生在不使用jQuery.extend的情況下,使用普通的.prototype方法。

任何人都可以幫助我嗎?

預先感謝您!

+1

什麼是「TestClass」?現在你正在附加到`SampleClass.prototype.array`而不是實例的單個屬性。 – 2011-02-16 10:37:30

+0

對不起,它是SampleClass而不是TestClass,現在我編輯了。雖然我有點兒得到了你的意見 - 這是我經過幾次嘗試之後的猜測。如果你想詳細說明,我很樂意接受答案。 – sh0uzama 2011-02-16 10:56:08

回答

3

發生這種情況,因爲每次的SampleClass「實例」正在共享一個collection屬性:當insertInCollection()方法訪問對象的collection財產,沒有被物體本身上找到,因此使用對象的原型的collection財產。要解決這個問題,您需要爲每個SampleClass對象創建一個新的collection陣列。 Init()方法將是一個很好的做法:

Init: function (arr) { 
    var c = this; 
    c.collection = []; 
    c.array = arr; 
    c.insertInCollection(); 
}, 
相關問題