2010-03-02 19 views
5

Czy istnieje sposób na skopiowanie obiektu globalnego (Array, String ...), a następnie rozszerzenie prototypu kopii bez wpływu na oryginalną? Próbowałem z tym:Kopiowanie i rozszerzanie obiektów globalnych w javascript

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

Ale jeśli sprawdzasz Array.prototype.test to 2 ponieważ obiekt Array jest przekazywane przez referencję. Chcę wiedzieć, czy istnieje sposób, aby zmienna "copy" zachowywała się jak tablica, ale może być rozszerzona bez wpływu na oryginalny obiekt Array.

+0

Zakładam, że pierwszy wiersz faktycznie brzmi: 'var copy = Array;' –

+0

Tak, przykro mi, zaktualizowałem to – mck89

+0

Aby utworzyć "podobną do tablicy" klasę zobacz http://stackoverflow.com/questions/366031/implement -array-like-behaviour-in-javascript-without-using-array Wygląda na to, że nie rozumiesz dziedziczenia JavaScript. Powinieneś mieć Google coś w stylu "prototypowego dziedziczenia Javascript". –

Odpowiedz

2

Dobre pytanie. Mam wrażenie, że możesz napisać do tego klasę opakowania. Zasadniczo robisz z copy.prototype.test=2 ustawieniem prototypu klasy, który będzie (oczywiście) widoczny dla wszystkich wystąpień tej klasy.

+0

Masz przykład dla klasy opakowania? – mck89

+0

@ mck89: Przepraszam, nie zauważyłem twojego komentarza tutaj. Funkcja powiadomienia S.O. wymaga trochę pracy, lol. Rozumiem, że udało ci się posortować klasę opakowania? – Codesleuth

+0

Tak, znalazłem coś na http://dean.edwards.name/weblog/2006/11/hooray/ – mck89

0

Zamiast przedłużać prototyp, może po prostu rozszerzyć zmienną kopii. Na przykład dodanie funkcji

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

Ponieważ w ten sposób, jeśli utworzę nowe wystąpienie kopii, nie będzie ono miało tej metody, ponieważ zajmie to tylko metody prototypowe. W każdym razie nie rozwiązuje to problemu, ponieważ rozszerza również oryginalny obiekt Array. – mck89

1

Myślę, że powodem, dla którego przykładem http://dean.edwards.name/weblog/2006/11/hooray/ nie działa, ponieważ jest to funkcja anonimowa. Tak więc, zamiast co następuje:

// 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 
}; 

chciałbyś coś takiego:

function Array2() { 

} 
Array2.prototype = new Array(); 

z moich własnych badań, właściwość length jest utrzymywana w IE z tego spadku. Ponadto, wszystko dodane do MyArray.prototype nie wydaje się być dodane do Array.prototype. Mam nadzieję że to pomoże.