我有一个现有的客户端应用程序,它使用类似这样的javascript对象:
var myObject = {
Id: 1,
Name: 'Foo',
Property1: 123,
Property2: 'ABC',
MyMethod: function() { ///do something },
MyMethod2: function() { /// do something else }
};
我现在正在尝试使用Firebase等服务来保留这些对象。 Firebase不喜欢包含这些功能的属性,因此我想知道在保存到Firebase时是否有一种“简单”的方式来删除有问题的功能,然后在检索时重新附加它们而不必创建每个功能的副本对象。
答案 0 :(得分:1)
一个相当常见的模式是使用附加了相关函数的构造函数,并让该构造函数接受它用于填充自身的对象的原始版本以及“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());
更复杂的处理将涉及在原始对象上放置一个备忘录,告诉您对象的一个属性本身是否使用此模式,因此您知道为其调用构造函数而不是仅仅复制它。 (老鹰眼睛会注意到上面的例子是不对称的,它在toRaw
中序列化时允许toRaw
属性,但在Thingy
中反序列化时则不允许{。}}。