2010-03-02 5 views
5

Y a-t-il un moyen de copier un objet global (Array, String ...) et ensuite d'étendre le prototype de la copie sans affecter l'original? Je l'ai essayé avec ceci:Copier et étendre des objets globaux en javascript

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

Mais si je vérifie Array.prototype.test c'est 2 parce que l'objet Array est passé par référence. Je veux savoir s'il existe un moyen de faire en sorte que la variable "copy" se comporte comme un tableau mais cela peut être étendu sans affecter l'objet Array d'origine.

+0

Je suppose que la première ligne lit réellement: 'var copy = Array;' –

+0

Ouais désolé je l'ai mis à jour – mck89

+0

Pour créer une "classe" de type Array voir http://stackoverflow.com/questions/366031/implement -array-like-behavior-in-javascript-without-using-array Il semble également que vous ne compreniez pas l'héritage Javascript. Vous devriez Google quelque chose comme "héritage prototypal Javascript". –

Répondre

2

Bonne question. J'ai le sentiment que vous pourriez avoir à écrire une classe d'emballage pour cela. Ce que vous faites essentiellement avec copy.prototype.test=2 est de définir un prototype de classe qui sera (bien sûr) visible pour toutes les instances de cette classe.

+0

Avez-vous un exemple pour la classe wrapper? – mck89

+0

@ mck89: désolé, je n'avais pas remarqué votre commentaire ici. La fonction de notification de S.O. a besoin de travail, lol. Je suppose que vous avez réussi à faire trier une classe d'emballage? – Codesleuth

+0

Oui, j'ai trouvé quelque chose sur http://dean.edwards.name/weblog/2006/11/hooray/ – mck89

0

Au lieu d'étendre le prototype, pourquoi ne pas étendre simplement la variable de copie. Par exemple, l'ajout d'une fonction

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

Parce que de cette façon, si je crée une nouvelle instance de copie, il n'aura pas la méthode, car il faudra seulement des méthodes de prototypage. Quoi qu'il en soit, cela ne résout pas le problème car il étend également l'objet Array d'origine. – mck89

1

Je pense que la raison pour laquelle l'exemple http://dean.edwards.name/weblog/2006/11/hooray/ ne fonctionne pas est parce qu'il est une fonction anonyme. Ainsi, au lieu de ce qui suit:

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

vous voulez quelque chose comme ceci:

function Array2() { 

} 
Array2.prototype = new Array(); 

De mes propres tests, la propriété length est maintenu dans IE avec cet héritage. En outre, tout élément ajouté à MyArray.prototype ne semble pas être ajouté à Array.prototype. J'espère que cela t'aides.