【问题标题】:Removing and reattaching properties mapped to functions from javascript objects从 javascript 对象中删除和重新附加映射到函数的属性
【发布时间】:2014-02-27 09:34:15
【问题描述】:

我有一个现有的客户端应用程序,它使用如下所示的 javascript 对象:

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

我现在希望尝试使用 Firebase 等服务来持久化这些对象。 Firebase 不喜欢包含函数的属性,所以我想知道是否有一种“简单”的方法可以在保存到 Firebase 时删除有问题的函数,然后在检索时重新附加它们,而不必创建每个函数的副本对象。

【问题讨论】:

  • 我想这可能已经在这里回答了stackoverflow.com/questions/208105/…
  • 查看上面的答案,但我也会在您的安全规则中添加类似 $other": {".validate": false} 的内容。

标签: javascript firebase


【解决方案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());

更复杂的处理将涉及在原始对象上放置一个备忘录,以告诉您该对象的某个属性本身是否使用此模式,因此您知道为它调用构造函数,而不仅仅是复制它。 (眼尖的人会注意到上面的例子是不对称的,它允许toRawtoRaw中序列化时的属性,但在Thingy中反序列化时不允许。)

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2015-11-24
    • 2015-03-29
    • 2019-06-21
    相关资源
    最近更新 更多