2015-01-06 4 views
0

У меня есть этот объект переходящую функцию:JavaScript: Deep Copy Image() объекта

function merge(obj1, obj2) 
{ 
    var result = {}; 
    for(var prop in obj1) 
    { 
     if(obj2.hasOwnProperty(prop)) 
     { 
      if('object' === typeof obj1[prop] && 'object' === typeof obj2[prop]) 
      { 
       result[prop] = merge(obj1[prop], obj2[prop]); 
      } 
      else 
      { 
       result[prop] = obj2[prop]; 
      } 
     } 
     else 
     { 
      result[prop] = obj1[prop]; 
     } 
    } 
    return result; 
}; 

Цель этой функции заключается в объединении двух объектов в один, перекрывая значения obj1 с теми obj2, если существует ,

Он отлично работает с большинством объектов, однако, когда я пытаюсь использовать его для слияния двух объектов Image(), меня бросают в бесконечный цикл. Например:

merge(new Image(), new Image()) 

результатов в:

Uncaught RangeError: Maximum call stack size exceeded 

Я думаю, что это что-то делать с событиями объекта, но я не уверен. Почему вы думаете, что это происходит, и как можно улучшить эту функцию, чтобы исправить эту проблему?

+1

Что вы пытаетесь достичь путем слияния двух 'Image' объектов? –

+0

Почему бы не использовать [cloneNode] (https://developer.mozilla.org/en-US/docs/Web/API/Node.cloneNode)? –

+0

@MattBall Я пытаюсь объединить два объекта, у которых есть объекты «Image» как одно из их свойств –

ответ

1

Первое, что есть null, является объектом, поэтому вы вызываете слияние для всех нулей.

Во-вторых, есть свойство

ownerDocument 

Таким образом, вы зацикливание над этим ...