나중에 내 응용 프로그램에서 'this'를 이전 상태로 되돌릴 수 있도록 javscript 개체에 'this'의 통계를 저장하려고합니다. 클로저를 사용하여 달성 할 수 있다고 생각했지만 지금까지 성공하지 못했습니다. 내 생각은 이런 식으로
function SavedFeature() {
var self = this;
this.savedItem;
this.storeState = function() {
this.savedItem = storeClosure();
}
function storeClosure() {
var closure = self;
return function() {
return closure;
};
};
//other things the user can change...
}
그래서 나중에 내 응용 프로그램에서 storeState를 호출 한 시점으로 돌아 가야하는 경우
//return the object I put in my closure
var backToNormal = savedFeature.savedItem();
storeState ()를 호출 한 후 savedFeature 객체에 대한 변경 사항이 savedItem () 호출에서 검색하는 항목에 반영되기 때문에 작동하지 않습니다. 클로저가 새 인스턴스에 복사되는 대신 self 참조로 설정되기 때문에 이것이 발생한다고 생각합니다.
어쨌든 내 전체 객체의 상태를 이와 같은 클로저에 저장하거나 다른 방법으로 저장해야합니까?
당신이 겪고있는 문제는 js 객체가 참조로 전달된다는 것입니다. 즉, 개체에서 수행 된 모든 변경 사항이 obj.savedItem
속성에 적용됩니다 .
수정 : 딥 클론 저장 obj.savedItem
this.storeState = function() {
this.savedItem = _.cloneDeep(this); // or _.clone(this, true);
}
cloneDeep
는 lodash 메소드이며, 대부분의 js lib 는 jQuery의 $ .extend 등과 같이 자체적 으로 제공합니다.
자신의 딥 클론 기능을 쉽게 롤링하고이 스레드 에서 옵션을 찾을 수 있습니다 .
jQuery를 사용한 완전한 예 :
function SavedFeature() {
this.savedItem;
this.clone = function() {
return $.extend(true, {}, this);
},
this.storeState = function() {
this.savedItem = this.clone();
}
}
이렇게하면 clone
사용 된 라이브러리 메서드를 facading하므로 메서드를 변경하여 다른 환경에 적응할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다