Удаление и присоединение свойств сопоставлены на функции от объектов JavaScript

StackOverflow https://stackoverflow.com//questions/22064377

  •  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, а затем присоединять их на поиск без необходимости создавать копии каждого изобъекты.

Это было полезно?

Решение

Довольно распространенный шаблон состоит в том, чтобы иметь функцию конструктора с соответствующими функциями, прилагаемыми к нему, и иметь этот конструктор принять необработанную версию объекта, который он использует для заполнения самого заполнения, а также «переподъемность» или аналогичную функцию, котораядает вам сырую копию.

Например:

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());
.

Более сложная обработка будет включать в себя помещение на сырье, чтобы сказать вам, является ли один из свойств объекта, сам, используя этот шаблон, чтобы вы знали, чтобы вызвать конструктор для него, а не просто копировать его.(Eagle-Eyed отметит, что приведенный выше приведенный выше приведенный выше приведенный выше приведенный выше, он обеспечивает генеракодицетагкод на свойствах при сериализации в генеракодицетагкоде, но не при десериализации в toRaw.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top