2010-09-07 17 views
5

Czy istnieją jakieś metody dołączania obiektu do innego obiektu?Dołączanie obiektów do istniejących obiektów

miałem szybki ukłucie w rzucanie to razem, ale nie jestem pewien, o kilka rzeczy:

  • Am I obsługi metod poprawnie? Dodałem wyjątek dla dołączenia, ale co z tym, kiedy istnieją inne funkcje prototypowe? Czy powinienem po prostu zignorować funkcje w nowej klasie?

  • Co należy zrobić o wartościach null/undefined?

  • Ponadto, właśnie pomyślałem o tablicach .. jaki byłby najlepszy sposób na obsługę tablic? typeof raportach jako „obiektu” .. Chyba, że ​​testowanie Array(). Value konstruktora byłoby rozwiązaniem

Innych niż te kilka kwestii wydaje się działać jak chcę go (nadpisywanie/dodawanie poszczególne części istniejącego obiektu tylko wtedy, gdy istnieje w nowym obiekcie). Czy są jakieś przypadki skrajne, które przeoczyłem?

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

Odpowiedz

2

Podoba mi się. Użyłem a similar, but not as robust method w moim kodzie. Ale prawdopodobnie byłoby bezpieczniej realizować go jako statycznej metody klasy Object:

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

Aby odpowiedzieć na Twoje pytania, nie znaleziono żadnych lepszych metod (poza ramy) to zrobić albo. W przypadku wartości null/undefined, jeśli _newObj ma wartości null/undefined, to czy obiekt adresata nie powinien również mieć tych obiektów (np. Nie należy w nich tworzyć specjalnych przypadków)?

+0

ten jest przeznaczony (później) do łączenia wartości "przechowywanych wartości" i "nowo uzyskanych" i martwi mnie, że mogę przypadkowo nadpisać zbiór danych zebranych przez ponad 30 dni w a przy null/undefined, jeśli skrypt miałby z jakiegoś powodu wadliwie działać (wypełnianie "nowy obiekt" ze złymi danymi), aby odpowiedzieć na pytanie, czy obiekt odbiorcy musi również mieć takie: nie jest konieczne arily .. – kwah

+0

Tak, w zależności od twoich potrzeb, będziesz musiał je uwzględnić. W moim kodzie uwzględniłem "" undefined ", ale nie" null ". – palswim

3

Zapomniałaś „logiczna”, jak w

typeof true 
+0

Dobry połów; Rozwiązałem to teraz w mojej odpowiedzi. – palswim

+0

Zgoda .. nie wiem, jak to przegapiłem;) Zmieniono także oryginalne pytanie =] – kwah

Powiązane problemy