2010-09-07 10 views
5

Gibt es Methoden, um ein Objekt an ein anderes Objekt anzuhängen?Objekte an vorhandene Objekte anhängen

Ich habe zu werfen zusammen das einen schnellen Stich hatte, aber ich bin über ein paar Dinge nicht sicher:

  • Am I Methoden eine korrekte Abwicklung? Ich habe eine Ausnahme für append hinzugefügt, aber was ist, wenn andere Prototyp-Funktionen existieren? Sollte ich Funktionen in der neuen Klasse einfach ignorieren?

  • Was kann ich bei null/undefinierten Werten tun?

  • Auch habe ich gerade über Arrays nachgedacht .. Was wäre der beste Weg, um Arrays zu behandeln? typeof Berichte als ‚Objekt‘ .. Ich denke, dass das Array Prüfung(). Konstruktor Wert der richtige Weg wäre

Anders als diese paar Fragen, um es scheint zu funktionieren, wie ich es will (Überschreiben/Hinzufügen einzelne Teile des bestehenden Objekts nur dort, wo es im neuen Objekt existiert). Gibt es Randfälle, die ich übersehen habe?

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

Antwort

2

Ich mag es. Ich habe a similar, but not as robust method in meinem Code verwendet. Aber es wäre wahrscheinlich sicherer sei es als statische Methode für die Objektklasse zu implementieren:

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

Ihre Fragen zu beantworten, ich habe keine besseren Methoden (außerhalb eines Rahmens) tun dies entweder gefunden. Für null/undefinierte Werte, wenn die _newObj null/undefined Werte hat, dann sollte das Empfängerobjekt auch diese nicht haben (d. H. Keinen speziellen Fall für diese machen)?

+0

Dies soll (später) zum Zusammenführen von 'gespeicherten Werten' und 'neu erhaltenen' Werten und es macht mir Sorgen, dass ich versehentlich ein Array von Daten, die über 30 Tage gesammelt wurden, mit null/undefined überschreiben könnte, wenn das Skript aus irgendeinem Grund fehlschlägt das 'neue Objekt' mit schlechten Daten), damit Sie darauf antworten können, ob das Empfängerobjekt auch diese haben muss: nicht notwendig arily .. – kwah

+0

Ja, je nach Ihren Bedürfnissen müssen Sie diese dann berücksichtigen. Ich habe "undefined" in meinem Code berücksichtigt, aber nicht "null". – palswim

3

vergessen Sie „boolean“, wie er in

typeof true 
+0

Guter Fang; Ich habe es jetzt in meiner Antwort behandelt. – palswim

+0

Einverstanden .. nicht sicher, wie ich das verpasst habe;) Auch die ursprüngliche Frage bearbeitet =] – kwah

Verwandte Themen