2012-10-17 8 views
0

나는 다음과 같은 코드자바 스크립트 Object.Create 복사 참조 객체하기

ViewModel.prototype.update = function(initial) { 
    var ittr, key, val, x; 
    for (key in initial) { 
    val = initial[key]; 
    if ($.isArray(val) && $.isArray(this[key]())) { 
     ittr = 0; 
     while (ittr < val.length) { 
     if (this[key].length > ittr) { 
      if ((this[key][ittr - 1]) instanceof ViewModel) { 
       x = Object.create(this[key][ittr - 1]); 
       x.update(val[ittr]); 
       this[key].push(x); 
      } 
     } 
     } 
    } 
    } 
} 

내가 뷰 모델에서 상속 객체를 가지고 있고, 그들은 모두 함수로 업데이트가에게 있습니다. 배열이있어서 json 객체의 새로운 요소로 업데이트하고 있습니다 (초기). 언젠가 Json 객체가 업데이트 할 기존 배열보다 길기 때문에 동일한 유형의 객체를 추가하고 싶습니다. 배열의 마지막 객체를 가리키는 Object.create (this [key] [ittr -1])를 사용하고 있습니다.이 객체에서 새 객체를 인스턴스화하려고 시도합니다. 문제는 모든 반복 작업에서 새 개체를 만들지는 않지만 오래된 개체의 복사본 일뿐입니다. 내가 어떻게 그걸 막을 수 있을지 생각해?

나뿐만 아니라

new $.extend({},this[key][ittr - 1]) 

은 내가 x.update 전화 이제까지는 배열의 모든 값을 변경하면 배열

x[ittr] = Object.create(this[key][ittr - 1]); 
x[ittr].update(val[ittr]); 
this[key].push(x[ittr]); 

로 X을 시도했습니다 JQuery와를 시도했습니다있는 x와 같게 설정되었습니다. 그래서 실제로 Object.create를 호출 할 때 새로운 객체를 만들지는 않습니다.

답변

0

글쎄, Object.create의 첫 번째 인수는 새로 생성 된 객체의 프로토 타입이 될 객체입니다. MDN을 참조하십시오. 본질적으로, 그것은 새로운 객체가 될 것이지만, 오래된 객체의 프로토 타입을 통해 모든 객체의 속성을 상속 받기 때문에 오래된 객체처럼 보일 것입니다. 첫 번째 인수로 ViewModel.prototype을 전달하고 두 번째 인수로 이전 객체를 전달합니다. 새로운 객체는 ViewModel.prototype에서 상속받지 않는 것을 제외하고는 새 객체가 이전 객체의 모든 속성을 가지므로 업데이트 또는 다른 프로토 타입 메서드/속성이 없으므로 확장 경로가 완전히 성공하지 못합니다.

+0

'Object.prototype.create'가 없습니다. – Bergi

+0

좋은 지적입니다. 그것은'Object.create' 여야합니다. –