나는 개체의 집합을 가지고 있고 나도어떻게 가상 객체 캐시를 만들 수 있습니까?
- 빌드에 새 개체 나
- 로드 기존 객체를 동일한 구문을 사용할 수 있어야합니다.
나는 개체와 개체를 사용하여 만든 컨텍스트를 사용하고이 데이터를 사용하여 개체가 이전에 만들어 졌는지 확인하는 "캐시"를 만들었습니다. 예를 들어, 내가 theObject = new myObject(param1, param2)
을 빌드하면, 캐시는 오브젝트를 { obj: theObject, context: { param1: param1, param2: param2 } }
으로 저장하고, param1
및 param2
의 동일한 값을 갖는 컨텍스트를 제공하면 다시로드됩니다.
myObject = function(param1, param2) {
var context = { param1: param1, param2: param2 };
var cacheHit = this.cache.find(context);
if (cacheHit) return cacheHit; // <-- Doesn't work :(
this.param1 = param1;
this.param2 = param2;
this.cache.save(this, context);
};
myObject.prototype = { cache: new myCacheObject }; // Shared cache in all instances
는 슬프게도, 나는 new
키워드가 나는 return
문을 사용할 수 없다는 것을 의미 배운 :
new
키워드로이 작업을 수행 할 수 있다고 생각하지 않습니다.
어떻게해야합니까?
업데이트는 :
그것은이 방법이 실제로 일을한다는 것을 밝혀 내 문제는 (이 자바 스크립트 상속 특히 때문에) 상속에 따른되었다. 이 객체를 확장 할 때, 나는 다음과 같은 구문을 사용 : 값을 반환하는 아이를 강제 할 수없는 부모의 생성자를 호출하기 때문에
myObject = function(param1, param2) {
if (arguments.length) {
var context = { param1: param1, param2: param2 };
var cacheHit = this.cache.find(context);
if (cacheHit) return cacheHit;
this.param1 = param1;
this.param2 = param2;
this.cache.save(this, context);
}
};
// Extended from myObject
anotherObject = function(foo, bar) {
// Call parent constructor
myObject.call(this, foo, bar);
};
anotherObject.prototype = new myObject;
anotherObject.prototype.constructor = anotherObject;
을, 아이는 명시 적를 의미한다.
anotherObject = function(foo, bar) {
return myObject.call(this, foo, bar);
};
희망, 내가 자식 클래스 생성자에서 아무것도 수행하는 경우, 이후이 일을 깨끗한 방법으로 가지고 올 수, 나는 값이 반환 된 경우 항상 확인해야합니다.
anotherObject = function(foo, bar) {
var possibleCacheHit = myObject.call(this, foo, bar);
if (possibleCacheHit) return possibleCacheHit;
// Do stuff
};
'.find '의 구현은 무엇입니까? 두 객체가 따로 생성된다면'.find'가 결과를주지 않는 이유가있을 수 있습니다 :'{}! == {}'는'true'를 반환합니다. – pimvdb
오브젝트를 반복하고 값을 (재귀 적으로) 제공된 오브젝트와 비교하여 각 패스에서 오브젝트를 불일치시킵니다. – Koviko
알 겠지만 정확히 "비교"되는 것은 무엇입니까? 나는 내용에 관계없이'=='/'==='가 기존 객체를 새로 생성 된 객체와 비교할 때 실패 할 것이기 때문에 묻습니다. – pimvdb