Clonar cualquier cosa con JavaScript -

Un tema o concepto que causa confusión cuando los desarrolladores comienzan con JavaScript es la idea de pasar objetos por referencia; por ejemplo, establecer dos variables iguales al mismo objeto en realidad crea una referencia a ese mismo objeto. Enviar un objeto a una función y modificar ese argumento dentro de la función en realidad modifica el objeto original. A veces preferiríamos enviar un clon de algo, una fecha, una matriz o tal vez un objeto literal. Dojo Toolkit proporciona un método excelente para clonar casi cualquier cosa. Aún mejor es que la funcionalidad es fácil de extraer de Dojo para su propio conjunto de herramientas.

JavaScript

El método de clonación clonará en profundidad nodos, literales de objetos, matrices, fechas, expresiones regulares y objetos genéricos:

function clone(src) {function mixin(dest, source, copyFunc) {var nombre, s, i, vacío = {};for(nombre en la fuente){// the (!(nombre en vacío) || vacío[ nombre ] !== s) la condición evita copiar propiedades en "fuente"// heredada de Object.prototype. Por ejemplo, si dest tiene un método toString() personalizado, // no lo sobrescribe con el método toString() que la fuente heredó de Object.prototypes = source[name];if(!(name in dest) || ( destino [nombre] !== s (!(nombre en vacío) || vacío[nombre] !== s))){dest[nombre] = copyFunc ? copyFunc(s): s;}}return dest;}if(!src || typeof src != "object" || Object.prototype.toString.call(src) === "[función de objeto]"){ // null, indefinido, cualquier no objeto o funciónreturn src;// cualquier cosa}if(src.nodeType "cloneNode" in src){// DOM Nodereturn src.cloneNode(true); // Nodo}if(src instanciade Fecha){// Fechareturn new Date(src.getTime());// Fecha}if(src instanciade RegExp){// RegExpreturn nueva RegExp(src); // RegExp}var r, i, l;if(src instanciade Array){// arrayr = [];for(i = 0, l = src.length; il; ++i){if(i en src) {r.push(clone(src[i]));}}// no clonamos funciones por razones de rendimiento//}else if(d.isFunction(src)){//// function//r = function( ){ return src.apply(esto, argumentos); };}else{// objetos genéricosr = src.constructor? nuevo src.constructor(): {};}return mixin(r, src, clone);}

El código proporcionado por Dojo también tiene la capacidad de clonar funciones, pero esa capacidad está deshabilitada por razones de rendimiento. He colocado la función mixin dentro del propio clon, pero también se puede definir en el mismo nivel y puedes usar mixin como una función general para fusionar objetos. ¡Este método, por supuesto, es sólo uno de los miles de fragmentos útiles que puedes encontrar en el kit de herramientas de Dojo!

Te podría interesar...

Deja una respuesta

Subir