Compléter les méthodes et propriétés d'un objet javascript avec celles d'un autre objet javascript.

script : transfer
langage : javascript
catégorie : fragment
usage : Compléter les méthodes et propriétés d'un objet javascript avec celles d'un autre objet javascript.
tags : technique
Si je vous dis que tranfer(A,B); retourne un objet contenant les propriétés
et méthodes de l'objet B complétées et/ou écrasées par celles
de l'objet A , c'est clair ?
Bof, pas trop, hein ? Alors procédons avec un exemple.
Admettons que nos deux objets A et B soient déclarés ainsi :
var A = { "prop_1" : "w", "prop_2" : "y", "prop_3" : "z" }; var B = { "prop_3" : "a", "prop_4" : "b", "prop_5" : "c" };
Comment ferions nous si nous voulions copier dans B les propriétés de A ? Comme ça ?
B = A;
Certainement pas, car B perdrait toutes ses propriétés initiales.
Sous le modèle json, on le décrirait alors ainsi :
{ "prop_1" : "w", "prop_2" : "y", "prop_3" : "z" }
Où donc sont passées prop_4 et prop_5 ?
Avec B = tranfer(A, B); en revanche, les propriétés de A
viennent compléter ou écraser celles de B, mais aucune des propriétés
non définies dans A n'est perdue dans B. Ce qui nous donne un objet B qui se décrit comme suit :
{ "prop_1" : "w", "prop_2" : "y", "prop_3" : "z" "prop_4" : "b", "prop_5" : "c", }
Bon, ok. Mais très concrètement, ça sert à quoi ?
Eh bien, pour ma part, je m'en sers souvent dans des scripts un peu élaborés, dans lesquels on peut passer des options en argument. La fonction transfer() me permet ainsi de remplacer les paramètres par défaut par ceux passé en options.
Imaginons des paramètres par défaut définis ainsi :
params = { "prop_1" : 10, "prop_2" : "hello world", "prop_3" : true }
Imaginons maintenant que les options suivantes ont été soumises dans l'appel du script :
options = { "prop_1" : 5, "prop_3" : false }
Pour obtenir la liste des paramètres que nous utiliserons finalement dans le script, nous utiliserons donc :
var au_final = transfer(options, params);
Nous obtiendrons donc les paramètres suivants :
{ "prop_1" : 5, "prop_2" : "hello world", "prop_3" : false }
Cette petite fonction n'a l'air de rien, mais je la trouve très commode. Et je suis certain qu'on peut lui trouver d'autres usages astucieux. Si jamais vous en voyez un, n'hésitez pas à me le suggérer. ;)
Le code de cette fonction est très court. Vous pouvez le recopier, ou le télécharger.
function transfer (source, dest) { var prop, transfered={}; for ( prop in dest ) { transfered[prop] = dest[prop]; } for ( prop in source ) { transfered[prop] = source[prop]; } return transfered; }