2011-06-13 30 views
2

我試圖讓一個構造函數,並在其中,我不得不/想把它放到一個數組:使用Javascript - 複製數組(按價值計算)爲原型

function Animal(s) { 
    this.myarr.push(s) 
    this.bark = function() { 
     console.log(this.myarr) 
    } 
} 

Animal.prototype = { 
    myarr: [] 
} 

var a = new Animal('a'); 
a.bark() 

var b = new Animal('b'); 
b.bark() 

的問題是,該陣列將被傳遞引用。其結果將是:

["a"] 
["a", "b"] 

我又試圖院長愛德華茲的基類:

var Animal = Base.extend({ 
    constructor: function(s) { 
    this.some.push(s) 
    }, 
    some: [], 

    bark: function() { 
    console.log(this.some) 
    } 
}); 

var a = new Animal('a'); 
a.bark() 

var b = new Animal('b'); 
b.bark() 

的結果是一樣的。

["a"] 
["a", "b"] 

我不知道這是否是陣列的方法應該是在一個javascript「類」系統處理......雖然我可以重新初始化屬性我每次調用構造時間爲[]。

那麼,有沒有人知道如何處理這個?我應該重新初始化屬性(如果它是一個數組)? 謝謝先進。

編輯:

這裏的問題是,每當調用構造函數(this.myarr.push(S)爲例)myArr,該會指向同一個陣列 - 這就是爲什麼一個新的實例後,陣列將增長在尺寸方面。

所以:

var a = new Animal('a') 
var b = new Animal('ab') 
var c = new Animal('abc') 
var d = new Animal('abcd') 

將導致到:

["a", "ab", "abc", "abcd"] 

我想要的(沒有定義構造函數中的myArr,該)myArr,該有一個默認值,每次我調用構造函數(通過新的動物( ())應該是[]。

回答

0

如果您將數組附加到構造函數的原型,則此數組將適用於所有實例,因此實例對其執行的所有操作都是反射在其他情況下,請致電.myarr。如果您想爲每個實例創建一個數組,則應將其定義爲「本地」屬性,即this.myarr可以做的是在原型中定義一個方法,將值推入this.myarr

所以,你的構造函數(類在JavaScript非extistent)可能看起來像:

function Animal(s) { 
    this.myarr = []; 
    this.bark = function() { 
     console.log(this.myarr) 
    } 
    this.myarrAdd(s); 
} 

Animal.prototype = { 
    myarrAdd: function(val){this.myarr.push(val); return this;} 
} 
+0

我已經試過了,但問題是,當你想擴展它們的構造 - 你將不能訪問this.myarr如果它沒有在原型中定義。無論如何,謝謝。 – fk2blow 2011-06-13 21:18:34

+0

我已經衝着迴應 - 你說得對。這是一個很好的解決方法。但是,再一次,如果Animal將被擴展,我不認爲它會被複制。 – fk2blow 2011-06-13 21:21:35

+0

我不確定我明白你的意思。從我提供的代碼中,嘗試擴展:'Animal.prototype.barksLoud = function(){return this.myarr [0] +'WHOOFF !! 「; }'。工作正常,並且'this.myarr'在該Animal.prototype擴展方法中可用 – KooiInc 2011-06-13 21:23:35