Vi esto en un complemento:
var options = $.extend(defaults, options);
¿Como funciona?
¿Qué extend()
hacer?
Vi esto en un complemento:
var options = $.extend(defaults, options);
¿Como funciona?
¿Qué extend()
hacer?
Respuestas:
La documentación no es precisa para explicar cómo funciona extender, así que realicé una pequeña prueba:
var a = {foo: 1, bar: 1};
var b = {foo: 2, baz: 2};
var c = {foo: 3};
var r = jQuery.extend(a,b,c);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar + " Baz=" + a.baz);
console.log("B: Foo=" + b.foo + " Bar=" + b.bar + " Baz=" + b.baz);
console.log("C: Foo=" + c.foo + " Bar=" + c.bar + " Baz=" + c.baz);
console.log("R: Foo=" + r.foo + " Bar=" + r.bar + " Baz=" + r.baz);
console.log("A === R?: " + (a === r));
(Los console.log
función está diseñada para funcionar en Firebug; reemplácela con alert () o alguna otra función de salida si lo desea).
Los resultados son:
A: Foo=3 Bar=1 Baz=2
B: Foo=2 Bar=undefined Baz=2
C: Foo=3 Bar=undefined Baz=undefined
R: Foo=3 Bar=1 Baz=2
A === R?: true
Por esto podemos ver que jQuery.extend ():
Esto es útil para combinar el usuario y los objetos de opción predeterminados juntos para obtener un conjunto completo de opciones:
function foo(userOptions) {
var defaultOptions = {
foo: 2,
bar: 2
};
var someOtherDefaultOptions = {
baz: 3
};
var allOptions = jQuery.extend(
defaultOptions,
someOtherDefaultOptions,
userOptions
);
doSomething(allOptions);
}
foo({foo:1, baz:1});
Tenga en cuenta que "nulo" es un valor válido para sobrescribir, pero "no definido" no lo es. Es posible que pueda hacer uso de esto.
var a = {foo: "a", bar: "a"};
var b = {foo: null, bar: undefined};
jQuery.extend(a,b);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar);
Resultados en:
A: Foo=null Bar=a
Si pasa solo un objeto a jQuery.extend()
, entonces jQuery asume que el jQuery
objeto en sí es el "primer" parámetro (es decir, el que se va a modificar), y su objeto es el "segundo" (es decir, el que se agrega al primero) . Entonces:
console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );
Resultados en:
Before: undefined
After: 1
{zed: 'dark'}
lugar de 2
y tú estableces r.baz.zed = 'light'
, ¿cuál sería el valor de b.baz.zed
? es decir, ¿las propiedades se copian o fusionan por referencia?
b.baz.zed
sería light
- es decir, los valores se fusionan por referencia. ver un violín
Se funde el contenido de un objeto a otro . Si pasamos dos objetos, las propiedades del segundo objeto se agregan al primer objeto / primer parámetro
Ex: $.extend(object1, object2);
Ahora object1 contiene propiedades de object2
Si queremos fusionar dos objetos , necesitamos pasar un objeto vacío en el primer parámetro
Ex: var newObject = $.extend({}, object1, object2);
Ahora newObject contiene ambas propiedades de object1 y object2 .
De la documentación de jQuery
Fusionar el contenido de dos o más objetos en el primer objeto.
En el contexto de un complemento: si el usuario no establece los parámetros opcionales para la función, se utilizará un valor predeterminado en su lugar.
¿Cómo funciona extend () en jQuery? [Resuelto]
jQuery tiene copia profunda y copia ligera. El primer booleano lo decide, verdadero para profundo y falso para ligero.
Por ejemplo:
jQuery.extend (false, {'a': {'a1': 1}}, {'a': {'a2': 2}})
el resultado será: {'a': {'a2': 2}} porque esta es una copia ligera, simplemente compare el nivel 1.
jQuery.extend (true, {'a': {'a1': 1}}, {'a': {'a2': 2}})
el resultado será: {'a': {'a1': 1, 'a2': 2}} Esta es una copia profunda con muchos niveles de objeto (como el nivel de la matriz)
jQuery.extend (a, b, c) con a, b, c es objeto o matriz. El flujo de sobreescritura será b-> a, c -> a (b sobreescribe a, c sobreescribe a ...) esta función devolverá ay a también cambiará el valor.
Ejemplos avanzados:
jQuery.extend ({'number_param': 1})
En caso de que solo pase un parámetro. jQuery se extenderá. console.log (jQuery ['number_param']) generará 1.
jQuery.extend (1, {'number_param': '2'}); Este ejemplo no es un anexo de jQuery. El primer parámetro debe ser booleano. En este caso, devolverá {'number_param': '2'} y jQuery no se actualizará.
jQuery.extend (a, b, c, d, e, f); El orden de fusión será. b -> a, c -> a, d -> a, e -> a, f -> a (b anula a, c anula a ...). Y la devolución del resultado será un.
con a = {'p': 1}. jQuery.extend (a, {'p': 2}, {'p': 3}, {'p': 4}, {'p': 5}) devolverá a, y a = {'p': 6}. El número de parámetros que se pasan a esta función es ilimitado.
El propósito es ampliar un objeto existente. Por ejemplo, si tenemos un objeto de plantilla y queremos extenderlo agregando más propiedades o anulando propiedades existentes, jquery extend puede ser útil.
var carObjectTemplate = {
"make": "honda",
"model":"city",
"mileage":"20",
"variant":"petrol"
};
ahora si queremos extenderlo,
$.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'});
nos dará salida, extendiendo carObjectTemplate y agregando
{"color":"red"} property and overriding "model" property from "city" to "amaze"
El primer parámetro booleano verdadero / falso es para indicar si necesitamos una copia profunda o superficial
Hace exactamente esto
Descripción : fusiona el contenido de dos o más objetos en el primer objeto.
Más en jQuery.extend ()