2010-03-02 10 views
5

¿Hay alguna manera de copiar un objeto global (Array, String ...) y luego extender el prototipo de la copia sin afectar la original? He intentado con esto:Copie y extienda objetos globales en javascript

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

Pero si puedo comprobar Array.prototype.test Es 2 porque el objeto Array se pasa por referencia. Quiero saber si hay una manera de hacer que la variable "copiar" se comporte como una matriz pero que se pueda extender sin afectar el objeto Array original.

+0

Supongo que la primera línea en realidad dice: 'var copy = Array;' –

+0

Sí, lo he actualizado – mck89

+0

Para crear una "clase" similar a Array, vea http://stackoverflow.com/questions/366031/implement -array-like-behavior-in-javascript-without-using-array También parece que no comprende la herencia de Javascript. Deberías buscar en Google algo así como "herencia de prototipos de Javascript". –

Respuesta

2

Buena pregunta. Tengo la sensación de que deberías escribir una clase contenedora para esto. Lo que esencialmente está haciendo con copy.prototype.test=2 es establecer un prototipo de clase que (por supuesto) será visible para todas las instancias de esa clase.

+0

¿Tiene algún ejemplo para la clase contenedora? – mck89

+0

@ mck89: lo siento, no había notado su comentario aquí. La función de aviso de S.O. necesita algo de trabajo, lol. Supongo que lograste ordenar una clase contenedora? – Codesleuth

+0

Sí, he encontrado algo en http://dean.edwards.name/weblog/2006/11/hooray/ – mck89

0

En lugar de extender el prototipo, ¿por qué simplemente no extiende la variable de copia? Por ejemplo, la adición de una función

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

Porque de esta manera, si creo una nueva instancia de copia, no tendrá el método porque tomará solo prototipos de métodos De todos modos, esto no resuelve el problema porque extiende el objeto Array original también. – mck89

1

Creo que la razón en el ejemplo http://dean.edwards.name/weblog/2006/11/hooray/ no funciona es porque es una función anónima. Así, en lugar de los siguientes:

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

le gustaría que algo como esto:

function Array2() { 

} 
Array2.prototype = new Array(); 

Desde mi propia prueba, la propiedad length se mantiene en el IE con esta herencia. Además, todo lo que se agregue a MyArray.prototype no parece agregarse al Array.prototype. Espero que esto ayude.

Cuestiones relacionadas