JavaScript オブジェクトから関数にマップされたプロパティの削除と再アタッチ
-
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 に保存するときに問題の関数を削除し、取得時にそれぞれのコピーを作成せずに再アタッチする「簡単な」方法があるかどうか知りたいです。オブジェクト。
解決
かなり一般的なパターンは、関連する関数が付加されたコンストラクター関数を用意し、そのコンストラクターに、それ自体を設定するために使用するオブジェクトの生のバージョンと、「toRaw」または同様の関数を受け入れさせることです。生のコピー。
例えば:
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());
より複雑な処理には、生のオブジェクトにメモを付けて、オブジェクトのプロパティの 1 つ自体がこのパターンを使用しているかどうかを知らせることが含まれます。これにより、単にコピーするのではなく、コンストラクターを呼び出す必要があることがわかります。(鋭い目のある人は、上記の例が非対称であることに気づくでしょう。 toRaw
シリアル化時のプロパティについて toRaw
, 、ただしデシリアライズ時にはそうではありません Thingy
.)
所属していません StackOverflow