从javascript对象中删除和重新附加映射到函数的属性

时间:2014-02-27 09:34:15

标签: javascript firebase

我有一个现有的客户端应用程序,它使用类似这样的javascript对象:

var myObject = {
   Id: 1,
   Name: 'Foo',
   Property1: 123,
   Property2: 'ABC',
   MyMethod: function() { ///do something },
   MyMethod2: function() { /// do something else }
};

我现在正在尝试使用Firebase等服务来保留这些对象。 Firebase不喜欢包含这些功能的属性,因此我想知道在保存到Firebase时是否有一种“简单”的方式来删除有问题的功能,然后在检索时重新附加它们而不必创建每个功能的副本对象。

1 个答案:

答案 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中反序列化时则不允许{。}}。