Удаление и присоединение свойств сопоставлены на функции от объектов JavaScript
-
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
.)