Come funziona extent () in jQuery?


119

Ho visto questo in un plugin:

var options = $.extend(defaults, options); 

Come funziona?

Cosa fa extend()?


1
Puoi leggere a riguardo nella documentazione di jQuery ma immagino che questa sia una spiegazione migliore per questo.
ifaour

jQuery ha buoni documenti. api.jquery.com Basta digitare il nome del metodo nel campo Search jQuery .
user113716

42
Penso che Todd voglia sapere come funziona jQuery.extend, NON come usarlo. Ad esempio, esegue il ciclo attraverso ciascuna proprietà per creare un oggetto completamente nuovo o utilizza l'ereditarietà del prototipo in un modo fantastico.
b01

Risposte:


178

Parametri multipli

La documentazione non è precisa nello spiegare come funziona l'estensione, quindi ho eseguito un piccolo test:

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));

(La console.logfunzione è pensata per funzionare in Firebug; sostituiscila con alert () o qualche altra funzione di output, se lo desideri).

I risultati sono:

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

Da questo possiamo vedere che jQuery.extend ():

  • Inizia con l'oggetto fornito dal primo parametro.
  • Aggiunge ad esso qualsiasi proprietà nel secondo parametro. Se la proprietà esiste già nel primo parametro, viene sovrascritta. L'oggetto per il secondo parametro rimane invariato.
  • Ripete quanto sopra con qualsiasi parametro successivo.
  • Restituisce il primo parametro.

Questo è utile per combinare insieme oggetti opzione utente e predefinito per ottenere un set completo di opzioni:

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

Nota che "null" è un valore valido per la sovrascrittura, ma "undefined" non lo è. Potresti essere in grado di farne uso.

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);

Risultati in:

A: Foo=null Bar=a

Parametro singolo

Se passi un solo oggetto a jQuery.extend(), allora jQuery presume che l' jQueryoggetto stesso sia il "primo" parametro (cioè: quello da modificare), e il tuo oggetto è il "secondo" (cioè: quello da aggiungere al primo) . Così:

console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );

Risultati in:

Before: undefined
After: 1

3
quindi se b.baz fosse un oggetto dì {zed: 'dark'}piuttosto che 2e tu imposti r.baz.zed = 'light', quale sarebbe il valore di b.baz.zed? cioè le proprietà sono copiate o unite per riferimento?
ErichBSchulz

4
per rispondere alla mia domanda, b.baz.zedsarebbe light- cioè i valori sono uniti per riferimento. vedere un violino
ErichBSchulz

4
splendida spiegazione, +1
Carrie Kendall

2
Spero che la documentazione ufficiale sia chiara come questa. +1
Thariq Nugrohotomo

2
$ .extend (true, oggetto1, oggetto2); e $ .extend (oggetto1, oggetto2); differenza ...
Vinay S Jain

27

Si fonde il contenuto di un oggetto all'altro . Se passiamo due oggetti, le proprietà del secondo oggetto vengono aggiunte al primo oggetto / primo parametro

Ex: $.extend(object1, object2);

Ora object1 contiene le proprietà di object2

Se vogliamo unire due oggetti , dobbiamo passare un oggetto vuoto nel primo parametro

Ex: var newObject = $.extend({}, object1, object2);

Ora newObject contiene entrambe le proprietà di object1 e object2 .


12

Dalla documentazione di jQuery

Unisci il contenuto di due o più oggetti insieme nel primo oggetto.

In un contesto di plugin: se l'utente non imposta i parametri opzionali per la funzione, verrà invece utilizzato un valore predefinito.


1
Questa risposta dovrebbe essere in un commento.
Nolo

Grazie JOBG !!
Harsha Vardhan

7

Come funziona extent () in jQuery? [Risolto]

jQuery ha una copia completa e una copia leggera. Il primo booleano lo decide, vero per profondo e falso per luce.

Per esempio:

  • jQuery.extend (false, {'a': {'a1': 1}}, {'a': {'a2': 2}})

    il risultato sarà: {'a': {'a2': 2}} perché questa è una copia leggera, confronta semplicemente il livello 1.

    inserisci qui la descrizione dell'immagine

  • jQuery.extend (true, {'a': {'a1': 1}}, {'a': {'a2': 2}})

    il risultato sarà: {'a': {'a1': 1, 'a2': 2}} Questa è una copia completa con molti livelli di oggetto (proprio come il livello di array)

    inserisci qui la descrizione dell'immagine

  • jQuery.extend (a, b, c) con a, b, c è un oggetto o un array. La sovrascrittura del flusso sarà b-> a, c -> a (b sovrascrivere a, c sovrascrivere a ...) questa funzione restituirà a e a cambierà anche il valore.

Esempi avanzati:

  • jQuery.extend ({'number_param': 1})

    Nel caso in cui passi solo un parametro. jQuery si estenderà. console.log (jQuery ['number_param']) restituirà 1.

    inserisci qui la descrizione dell'immagine

  • jQuery.extend (1, {'number_param': '2'}); Questo esempio non è aggiungere jQuery stesso. Il primo parametro deve essere booleano. In questo caso restituirà {'number_param': '2'} e jQuery non verrà aggiornato.

    inserisci qui la descrizione dell'immagine

  • jQuery.extend (a, b, c, d, e, f); L'unione dell'ordine sarà. b -> a, c -> a, d -> a, e -> a, f -> a (b sovrascrive a, c sovrascrive a ...). E il ritorno del risultato sarà a.

    con a = {'p': 1}. jQuery.extend (a, {'p': 2}, {'p': 3}, {'p': 4}, {'p': 5}) restituirà a e a = {'p': 6}. Il numero di parametri passati a questa funzione è illimitato.

    inserisci qui la descrizione dell'immagine


1
Dai dock "Attenzione: il passaggio di false per il primo argomento non è supportato."
Nolo

2

Lo scopo è estendere un oggetto esistente. Ad esempio, se abbiamo un oggetto modello e vogliamo estenderlo aggiungendo più proprietà o sovrascrivendo le proprietà esistenti, jquery extent può essere utile.

var carObjectTemplate = {
"make": "honda",
"model":"city",
"mileage":"20",
"variant":"petrol"

};

ora se vogliamo estenderlo, $.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'}); ci darà ouput, estendendo carObjectTemplate e aggiungendo

{"color":"red"} property and overriding "model" property from "city" to "amaze"

Il primo parametro booleano vero / falso serve a indicare se abbiamo bisogno di una copia profonda o superficiale


Cosa significa copia profonda o superficiale?
Selva Ganapathi

0

Fa esattamente questo

Descrizione : unisce il contenuto di due o più oggetti nel primo oggetto.

Altro su jQuery.extend ()


1
Le risposte di una riga e i collegamenti ai documenti non sono di grande utilità come risposta e dovrebbero essere lasciati in un commento.
Nolo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.