문제

이와 같이 보이는 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 할 때는 그렇지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top