2010-07-26 4 views
3

Je viens de trébucher sur un petit problème lors de l'extension des objets javascript en utilisant jQuery. Lors de l'exécution

var item = $.extend(options.itemDefaults, item); 

options.itemDefaults est étendue avec les propriétés qui sont déjà en item et le résultat est Transmis à item. Jusqu'ici tout va bien.

Mais le temps suivant cette ligne est exécutée, options.itemDefaults a toutes les valeurs de propriété item Had, au lieu des valeurs par défaut d'origine. Mes défauts sont perdus!

Je me rends compte que je pouvais simplement stocker l'objet par défaut dans une variable temporaire, et étendre la variable temporaire à la place, mais il semble un peu long. Existe-t-il un moyen de faire ce que je veux (en remplaçant les valeurs par défaut par celles fournies, en prenant les valeurs par défaut lorsqu'aucune valeur n'est fournie, mais en ne modifiant pas l'objet par défaut) sans ce détour?

Mise à jour: Il semble que ce n'était pas aussi facile de se déplacer que je l'espérais. Quand je fais

var defaults = options.itemDefaults; 
var $item = $.extend(defaults, { attributeModel: options.attributeModel }, item); 
defaults = undefined 

à chaque itération, je encore ajouter des propriétés de item sur options.itemDefaults! Comment puis-je contourner cela?

Répondre

9

Essayez,

var item = $.extend(true, {}, options.itemDefaults, item); 

Le drapeau true indique qu'un deep copy doit être faite.

Nous utilisons un objet vide {} comme cible afin que les valeurs par défaut ne soient pas altérées. Les propriétés options.itemDefaults et item seront copiées dans l'objet vide.

+0

Brillant! C'était exactement ce que je recherchais. Merci! =) –

+0

De rien, content que ça a aidé :) – Anurag

Questions connexes