2010-09-07 5 views
5

Existe-t-il des méthodes pour ajouter un objet à un autre objet?Ajout d'objets à des objets existants

J'ai eu un coup de poignard rapide à lancer cela ensemble, mais je ne suis pas sûr de deux choses:

  • Suis-je manipuler correctement les méthodes? J'ai ajouté une exception pour append, mais qu'en est-il quand d'autres fonctions de prototype existent? Devrais-je simplement ignorer les fonctions de la nouvelle classe?

  • Que dois-je faire à propos des valeurs null/undefined?

  • En outre, je viens de penser à des tableaux .. quelle serait la meilleure façon de gérer les tableaux? typeof rapports comme « objet » .. Je suppose que ce test Array() valeur constructeur. serait la voie à suivre

Autre que ces deux questions, il semble fonctionner comme je veux qu'il (le remplacement/ajouter des parties individuelles de l'objet existant uniquement s'il existe dans le nouvel objet). Y a-t-il des cas limites que j'ai manqués?

Object.prototype.append = function(_newObj) 
{ 
    if('object' !== typeof _newObj) { 
    console.info("ERROR!\nObject.prototype.append = function(_newObj)\n\n_newObj is not an Object!"); 
    } 

    for (newVar in _newObj) 
    { 
    switch(typeof _newObj[newVar]){ 
     case "string": 
     //Fall-through 
     case "boolean": 
     //Fall-through 
     case "number": 
     this[newVar] = _newObj[newVar]; 
     break; 

     case "object": 
     this[newVar] = this[newVar] || {}; 
     this[newVar].append(_newObj[newVar]); 
     break; 

     case "function": 
     if(newVar !== 'append'){ 
      this[newVar] = _newObj[newVar]; 
     } 
     break; 
    } 
    } 

    return this; 

} 


var foo = { 1:'a', 2:'b', 3:'c' }; 
var bar = { z: 26, y: 25, x: 24, w: { 'foo':'bar'}, v: function(){ alert('Hello world"'); } }; 

foo.append(bar); 
console.info(foo); 

Répondre

2

J'aime ça. J'ai utilisé a similar, but not as robust method dans mon code. Mais il serait probablement plus sûr de mettre en œuvre comme une méthode statique pour la classe de l'objet:

if (typeof Object.merge !== 'function') { 
    Object.merge = function(_obj, _newObj) 
    { 
     if("object" !== typeof _obj) 
      console.info("ERROR!\nObject.merge = function(_obj, _newObj)\n\n_obj is not an Object!"); 
     if("object" !== typeof _newObj) 
      console.info("ERROR!\nObject.merge = function(_obj, _newObj)\n\n_newObj is not an Object!"); 

     for (newVar in _newObj) 
     { 
      switch(typeof _newObj[newVar]){ 
       case "object": 
        _obj[newVar] = _obj[newVar] || {}; 
        Object.merge(_obj[newVar], _newObj[newVar]); 
        break; 
       case "undefined": break; 
       default: // This takes care of "string", "number", etc. 
        _obj[newVar] = _newObj[newVar]; 
        break; 
      } 
     } 
     return _obj; 
    } 
} 

var foo = { 1:'a', 2:'b', 3:'c' }; 
var bar = { z: 26, y: 25, x: 24, w: { 'foo':'bar'}, v: function(){ alert('Hello world"'); } }; 
Object.merge(foo, bar); 
console.info(foo); 

Pour répondre à vos questions, je ne l'ai pas trouvé de meilleures méthodes (en dehors d'un cadre) de le faire non plus. Pour les valeurs null/undefined, si le _newObj a des valeurs nulles/indéfinies, alors votre objet destinataire ne devrait-il pas avoir ces valeurs (c'est-à-dire ne pas faire de cas particulier pour celles-ci)?

+0

Ceci est destiné (plus tard) pour fusionner les valeurs "stockées" et "nouvellement obtenues" et cela m'inquiète que je puisse accidentellement écraser un tableau de données collectées plus de 30 jours dans un avec null/indéfini si le script devait mal fonctionner pour une raison quelconque (remplissage le 'nouvel objet' avec de mauvaises données), donc pour vous répondre si l'objet destinataire doit aussi avoir ceux-ci: pas nécessaire ary .. – kwah

+0

Ouais, selon vos besoins, vous devrez rendre compte de ceux-là. J'ai représenté '' "undefined" 'dans mon code, mais pas' null'. – palswim

3

Vous avez oublié « booléen » comme dans

typeof true 
+0

Bonne prise; Je l'ai traité dans ma réponse maintenant. – palswim

+0

D'accord .. pas sûr comment j'ai raté cela;) Également modifié la question originale =] – kwah

Questions connexes