À l'aide de JSON.stringify sur la classe personnalisée
Je suis en train de stocker un objet dans le redis, qui est une instance d'une classe, et donc a des fonctions, voici un exemple:
function myClass(){
this._attr = "foo";
this.getAttr = function(){
return this._attr;
}
}
Est-il un moyen de stocker de cet objet dans le redis, avec toutes les fonctions? J'ai essayé JSON.stringify()
mais seulement les propriétés sont conservées. Comment puis-je stocker les définitions de fonction et d'être en mesure d'effectuer quelque chose comme ce qui suit:
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'"
Comment puis-je obtenir foo
lors de l'appel de parsedObj.getAttr()
?
Vous en remercie d'avance!
MODIFIER
Ai une suggestion pour modifier le MyClass.prototype et stocker les valeurs, mais que penser de quelque chose comme ça (d'autres fonctions que le setter/getter):
function myClass(){
this._attr = "foo";
this._accessCounts = 0;
this.getAttr = function(){
this._accessCounts++;
return this._attr;
}
this.getCount = function(){
return this._accessCounts;
}
}
Je suis en train d'illustrer une fonction qui calcule quelque chose comme un nombre ou une moyenne à chaque fois qu'il est appelé, en dehors de faire d'autres choses.
OriginalL'auteur scanales | 2012-11-27
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous n'êtes pas à la définition d'une classe.
C'est juste un objet, une propriété dont la valeur est une fonction (l'Ensemble de ses fonctions de membre défini dans le constructeur sera copié lors de la création d'un nouveau instance, c'est pourquoi je dis que c'est pas une classe.)
Qui seront éliminés lors de l'utilisation de
JSON.stringify
.Pensez à l'aide de node.js qui est à l'aide de V8, le meilleur moyen est de définir une véritable classe, et de jouer un peu de magie avec
__proto__
. Qui fonctionnera très bien, peu importe combien les biens que vous avez utilisé dans votre classe (tant que chaque propriété est à l'aide de types de données primitifs.)Voici un exemple:
qui sera de sortie:
donc, si l'une des propriétés est un objet, cela ne fonctionne pas?
si c'est un objet ordinaire, cela fonctionnera très bien. mais si c'est une instance d'une classe, vous aurez besoin de mettre ses
__proto__
de manière récursive.qui a fait le tour, merci beaucoup!
OriginalL'auteur xiaoyi
Non, JSON ne pas stocker des fonctions (ce qui serait tout à fait inefficace, trop). Au lieu de cela, utiliser une méthode de sérialisation et d'un deserialisation constructeur. Exemple:
est une méthode de lecture, trop, n'est-ce pas?
Je voulais dire que l'incrément de accessCounts sur le getAttr, ce qui n'est pas seulement une propriété statique comme avant.
Comme
accessCounts
est également à seulement un [public] propriété de l'objet, il n'y a pas de différence deattr
.OriginalL'auteur Bergi
Scanales, j'ai eu le même problème et a essayé une technique similaire à celle de Bergi de la recommandation de créer de nouveaux sérialisation/désérialisation des méthodes...mais cela ne fonctionne pas pour moi parce que j'ai des objets imbriqués dans des objets (plusieurs de profondeur). Si c'est votre cas, alors voici comment je l'ai résolu. J'ai écrit une classe de base (clsPersistableObject) à partir de laquelle tous les objets que je voulait persister héritée de. La classe de base a une méthode appelée désérialiser, qui est passé à la chaîne JSON. Cette méthode permet de définir les propriétés de l'un par un (mais ne pas effacer l'existence de méthodes) et puis, de manière récursive reporter à l'objet enfant à faire de même (autant de fois que nécessaire).
OriginalL'auteur Ian Ippolito
Ce que vous obtenez de retour grom JSON.stringify() est une Chaîne de caractères. Une chaîne n'a pas de méthodes.
Vous devez eval première chaîne) et ensuite, vous serez en mesure d'obtenir l'objet d'origine
et ses méthodes.
---- EDIT -----
JSON.stringify
seulement ignore la fonction les membres, donc cela ne fonctionnera pas.J'ai trouvé cette fonction
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; }
sur [stackoverflow.com/questions/3685703/... la poste), et il stringifies les fonctions, mais ne peuvent pas les obtenir bkne peut pas le faire revenir dans une utilisable, toutes les pensées?
eval = le mal. Surtout ne faites pas confiance informations vous retrouver à partir d'un serveur avec la fonction eval. Cela étant dit, JSON.analyser / stringify ne comprend pas nonenumerable propriétés ( comme le prototype ). havent essayé @scanales fonction, mais il semble légitime, sauf pour le supprimer l'Objet.le prototype.la méthode toJSON partie. les suppressions sont intrinsèquement les plus gourmands en mémoire, c'est pourquoi google js styleguide dit de ne pas le faire, mais au lieu de définir la propriété null
OriginalL'auteur kante
il semble que vous essayez de stringify fermé de la fonction. vous pouvez utiliser ()=>{} pour résoudre le problème de la portée.
OriginalL'auteur Cery