JavaScript 객체에서 함수에 매핑 된 속성 제거 및 reattaching
-
23-12-2019 - |
문제
이와 같이 보이는 JavaScript 객체를 사용하는 기존 클라이언트 측 응용 프로그램이 있습니다.
var myObject = {
Id: 1,
Name: 'Foo',
Property1: 123,
Property2: 'ABC',
MyMethod: function() { ///do something },
MyMethod2: function() { /// do something else }
};
.
이제 Firebase와 같은 서비스를 사용하여 이러한 개체를 유지하려고 노력하고 있습니다.Firebase는 기능이 포함 된 속성을 좋아하지 않으므로 Firebase에 저장할 때 불쾌한 기능을 제거한 다음 각각의 복사본을 생성하지 않고 검색 할 때 검색 할 수있는 '간단한'방법이 있는지 알고 싶습니다.물체.
해결책
상당히 일반적인 패턴은 해당 기능을 연결하여 생성자 기능을 갖추고 있으며 생성자가 "cow"또는 유사한 함수를 채우는 데 사용하는 객체의 원시 버전을 수락하는 것입니다.원시 사본을 제공합니다.
예 :
function Thingy(raw) {
var name;
for (name in raw) {
if (raw.hasOwnProperty(name)) {
this[name] = raw[name];
}
}
}
Thingy.prototype.MyMethod = function() { /* ... */ };
Thingy.prototype.MyMethod2 = function() { /* ... */ };
Thingy.prototype.toRaw = function() {
var raw, name, value;
for (name in this) {
if (this.hasOwnProperty(name)) {
value = this[name];
if (typeof value !== "function") {
if (value.toRaw) {
raw[name] = value.toRaw();
} else {
raw[name] = this[name];
}
}
}
}
};
.
다음 firebase에 저장시 :
write(myObject.toRaw());
.
... 그리고 Firebase에서 읽을 때 :
var obj = new Thingy(read());
.
더 복잡한 취급은 RAW 객체에 메모를 넣어 객체의 속성 중 하나 가이 패턴을 사용하는지 여부를 알려줍니다.(Eagle-eyed는 위의 예제가 Asymetrical이며 toRaw
에서 직렬화 할 때 속성의 toRaw
가 가능하지만 Thingy
에서 deserializing 할 때는 그렇지 않습니다.)
제휴하지 않습니다 StackOverflow