2010-03-02 42 views
5

有沒有辦法複製全局對象(Array,String ...),然後在不影響原始對象的情況下擴展副本的原型?我試着這樣:在javascript中複製和擴展全局對象

var copy=Array; 
copy.prototype.test=2; 

但是,如果我檢查Array.prototype.test,因爲數組對象是按引用傳遞是2。我想知道是否有辦法讓「複製」變量的行爲像一個數組,但可以在不影響原始數組對象的情況下進行擴展。

+0

我假設第一行實際上是:'var copy = Array;' – 2010-03-02 12:02:53

+0

對不起,我已經更新了它 – mck89 2010-03-02 13:30:10

+0

要創建一個類似數組的類,請參閱http://stackoverflow.com/questions/366031/implement -array-like-behavior-in-javascript-without-using-array 這似乎也是你不明白JavaScript的繼承。你應該像Google的東西一樣「Javascript原型繼承」。 – 2010-03-03 00:01:12

回答

2

好問題。我有一種感覺,你可能不得不爲此編寫一個包裝類。你基本上用copy.prototype.test=2做的是設置一個類的原型,當然這個類的原型對於該類的所有實例都是可見的。

+0

你有包裝類的例子嗎? – mck89 2010-03-02 13:32:49

+0

@ mck89:對不起,我沒有注意到你在這裏的評論。 S.O.的通知功能需要一些工作,哈哈。我把它設法得到一個包裝類的排序? – Codesleuth 2010-03-04 09:38:44

+0

是的,我發現http://dean.edwards.name/weblog/2006/11/hooray/ – mck89 2010-03-04 17:30:10

0

而不是擴展原型,爲什麼不簡單擴展副本變量。例如,添加一個功能

copy.newFunction = function(pParam1) { 
     alert(pParam1); 
}; 
+0

上的東西因爲這樣如果我創建一個新的副本實例它不會有方法,因爲它會採取只有原型方法。無論如何,這並不能解決問題,因爲它也擴展了原始的Array對象。 – mck89 2010-03-02 13:38:22

1

我覺得在http://dean.edwards.name/weblog/2006/11/hooray/的例子不工作的原因是因爲它是一個匿名函數。所以,不要使用以下:

// create the constructor 
var Array2 = function() { 
    // initialise the array 
}; 

// inherit from Array 
Array2.prototype = new Array; 

// add some sugar 
Array2.prototype.each = function(iterator) { 
// iterate 
}; 

你想是這樣的:

function Array2() { 

} 
Array2.prototype = new Array(); 

從我自己的測試中,length性能維持在IE中使用這種繼承。此外,添加到MyArray.prototype的任何內容都不會添加到Array.prototype。希望這可以幫助。