我有一个现有的客户端应用程序,它使用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());
.

更复杂的处理将涉及将备忘录放在原始对象上,告诉您对象的属性之一是,使用此模式,所以您知道要调用它的构造函数而不是仅复制它。(鹰眼将注意到上面的示例是断言,它允许在toRaw中序列化时的属性上的toRaw,但在Thingy中的反序列化时不存在。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top