Mithilfe von JSON.stringify auf benutzerdefinierte Klasse
Ich versuche zu speichern ein Objekt in redis, die eine Instanz einer Klasse, und hat somit Funktionen, hier ein Beispiel:
function myClass(){
this._attr = "foo";
this.getAttr = function(){
return this._attr;
}
}
Gibt es eine Möglichkeit, um dieses Objekt zu speichern in redis, zusammen mit den Funktionen? Ich habe versucht JSON.stringify()
aber nur die Eigenschaften sind erhalten geblieben. Wie kann ich die speichern die Funktion Definitionen und in der Lage sein, um etwas wie die folgenden:
var myObj = new myClass();
var stringObj = JSON.stringify(myObj);
//store in redis and retreive as stringObj again
var parsedObj = JSON.parse(stringObj);
console.log(myObj.getAttr()); //prints foo
console.log(parsedObj.getAttr()); //prints "Object has no method 'getAttr'"
Wie bekomme ich foo
beim Aufruf parsedObj.getAttr()
?
Vielen Dank im Voraus!
BEARBEITEN
Habe einen Vorschlag zum ändern der MyClass.Prototyp und die Werte zu speichern, aber was ist mit so etwas wie dieses (andere Funktionen als setter/getter):
function myClass(){
this._attr = "foo";
this._accessCounts = 0;
this.getAttr = function(){
this._accessCounts++;
return this._attr;
}
this.getCount = function(){
return this._accessCounts;
}
}
Ich versuche zu veranschaulichen, eine Funktion, die berechnet, so etwas wie ein Graf oder ein Durchschnitt, Wann immer es genannt wird, abgesehen von anderen Sachen.
InformationsquelleAutor scanales | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie sind nicht der Definition einer Klasse.
Es ist nur ein Objekt mit einer Eigenschaft, deren Wert eine Funktion (Alle seine member-Funktionen definiert im Konstruktor wird kopiert beim erstellen eines neuen Instanz, das ist, warum ich sagen, es ist nicht eine Klasse.)
Wird abgestreift werden, wenn mit
JSON.stringify
.Betrachten Sie mit node.js was ist mit V8, der beste Weg ist, um eine echte Klasse, und spielen Sie ein wenig Magie mit
__proto__
. Das wird funktionieren, egal wie viele Immobilien Sie verwendet in Ihrer Klasse (so lange, wie jede Immobilie ist mit primitiven Datentypen.)Hier ist ein Beispiel:
die Ausgabe:
also, wenn Sie eine der Eigenschaften ist ein Objekt, das nicht funktionieren?
wenn es sich um eine nur-Objekt, es wird funktionieren. aber wenn es eine Instanz einer Klasse, Sie benötigen, um Ihre
__proto__
rekursiv.das war der trick, vielen Dank!
InformationsquelleAutor xiaoyi
Nein, JSON speichert keine Funktionen (das wäre ziemlich ineffizient). Verwenden Sie stattdessen eine Methode serialisieren und deserialisation Konstruktor. Beispiel:
ist eine getter-Methode, auch, nicht wahr?
Ich meinte die Schrittweite auf accessCounts auf die getAttr, die nicht nur eine statische Eigenschaft wie vorher.
Als
accessCounts
ist auch nur eine [öffentliche] - Eigenschaft des Objekts, es ist kein Unterschied zuattr
.InformationsquelleAutor Bergi
Scanales, ich hatte das gleiche Problem und versucht, eine Technik ähnlich wie die Bergischen die Empfehlung der Schaffung von neuen Serialisierung/Deserialisierung Methoden...fand aber es hat nicht funktioniert für mich, weil ich Objekte in Objekte (mehrere tiefen). Wenn das Ihr Fall ist, dann ist hier, wie ich gelöst. Ich schrieb eine base-Klasse (clsPersistableObject), von der alle Objekte, die wollte ich beibehalten, geerbt. Die Basisklasse hat eine Methode namens Deserialisieren, die übergeben wird der JSON-string. Diese Methode legt die Eigenschaften eins nach dem anderen (aber nicht wischen Sie die vorhanden Methoden) und dann rekursiv aufschieben auf das untergeordnete Objekt, das gleiche zu tun (so oft wie nötig).
InformationsquelleAutor Ian Ippolito
Was bekommen Sie zurück grom JSON.stringify() ist ein String. Ein string hat keine Methoden.
Sie müssen eval erste, der string und dann werden Sie in der Lage, um die original-Objekt
und seine Methoden.
- - - - - EDIT - - - - - -
JSON.stringify
nur überspringt die Funktion Mitglieder, so wird dies nicht funktionieren.Ich fand diese Funktion
function toJSONWithFuncs(obj) { Object.prototype.toJSON = function() { var sobj = {}, i; for (i in this) if (this.hasOwnProperty(i)) sobj[i] = typeof this[i] == 'function' ? this[i].toString() : this[i]; return sobj; }; var str = JSON.stringify(obj); delete Object.prototype.toJSON; return str; }
auf [stackoverflow.com/questions/3685703/... post), und es stringifies die Funktionen, aber cant get Sie bkkönnen nicht wieder in einen brauchbaren Weg, irgendwelche Gedanken?
eval = evil. Vor allem dont trust Informationen, die Sie immer wieder von einem server, der mit eval. That being said, JSON.analysieren / stringify nicht enthalten nonenumerable Eigenschaften ( wie Prototyp ). habe nicht versucht @scanales-Funktion, aber es scheint echt, außer für das Objekt löschen.der Prototyp.toJSON Teil. löscht von Natur aus zu Speicher-intensiv, das ist, warum google js styleguide sagt, es nicht zu tun, sondern setzen Sie die Eigenschaft auf null
InformationsquelleAutor kante
es sieht aus wie Sie versuchen zu stringify eine geschlossene Funktion. können Sie mit ()=>{} zu lösen, den Umfang problem.
InformationsquelleAutor Cery