2012-06-16 3 views
6

Ich arbeite mit einigen Objekten, die eine Reihe von Daten enthält, die vom Browser angezeigt und bearbeitet werden sollen, und ich möchte sie im lokalen Speicher speichern. Um Objekte zu speichern habe ich JSON.stringify() so alles geworden Text, und es funktioniert gutSpeichern einer Funktion im lokalen Speicher

{ 
"bindingRef": [], 
"primo": { 
    "name": "primo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Primi" 
}, 
"secondo": { 
    "name": "secondo", 
    "modifiable": true, 
    "binded": false, 
    "isInteger": false, 
    "label": "Numero di Secondi" 
} 
} 

Jetzt

Ich versuche, es in einen String, indem auch eine Funktion zum Speichern Umwandlung und dann saveing
JSON.stringify(myFunction.toString()); 

aber die Ausgabe ist die

"savedFunction": "function() {\n\t\t\t\tvar tot = menu.primo.get() * 6 + menu.secondo.get() * 8 + menu.dolce.get() * 4;\n\t\t\t\tif (menu.sconto.get()) {\n\t\t\t\t\treturn tot * 0.90;\n\t\t\t\t} else {\n\t\t\t\t\treturn tot;\n\t\t\t\t}\n\t\t\t}" 

ist es der richtige Weg, um eine Funktion im lokalen Speicher zu speichern, oder gibt es einen besseren Weg, dies zu tun? Wenn dies der richtige Weg ist, gibt es eine Möglichkeit, Tabulations-/Einrückungszeichen einfach zu entfernen, oder sollte ich die Zeichenfolge manipulieren, zum Beispiel mit einer Regexp-Funktion?

+0

Sie möchten Objekt mit String oder Funktionssignatur speichern? Welche Ausgabe erwarten Sie? – Sarfraz

+0

Warum möchten Sie eine Funktion speichern? Meiner Meinung nach gibt es keinen "richtigen" Weg, dies zu tun, weil es keinen Sinn macht, es überhaupt zu tun. Angenommen, Sie möchten die '.toString()' Version der Funktion speichern, warum möchten Sie Tabs entfernen (was Sie mit '.replace()' tun könnten)? – nnnnnn

Antwort

5

Funktion in JS wie in vielen funktionalen Sprachen sind Closures: Sie umhüllen in ihnen den Inhalt des Umgebungsbereichs zum Zeitpunkt der Definition, einschließlich ephemeraler Daten wie db oder Datei-Handles.

Dies ist keine gute Idee, da dies zu Problemen aufgrund des JSON-Deserialisierungsverhaltens führen kann. Sie müssen also überprüfen, was in der Funktion eingeschlossen ist und was selbst definiert ist.

Siehe auch diese SO thread für weitere Informationen.

+0

nützlicher Link und nützliche Antwort, ich werde versuchen, das Speichern einer Funktion zu vermeiden. Danke – Naigel

1

Sie können die Funktion in einem Objekt setzen und die Funktionen storage.set und storage.get verwenden, die ich erstellt statt localStorage.set und localStorage.get (local erlauben keine Funktionen hinzugefügt werden, im Gegensatz zu JSON).

storage.set wird ein Objekt einschließlich Funktionen vor der Verwendung von localStorage.setItem() stringifizieren.
storage.get analysiert ein Objekt mit Funktionen nach der Verwendung von localStorage.getItem().

Ich habe die Funktionen JSON.stringify und JSON.parse geändert, um mit Funktionen umgehen zu können, damit Sie sie in anderen Teilen Ihres Codes verwenden können, ohne die Funktionsnamen zu ändern. Ich habe eine 2 an die ursprünglichen Funktionen angehängt, damit ich sie in den aktualisierten Funktionen verwenden kann.

JSON.stringify2 = JSON.stringify; 
JSON.parse2 = JSON.parse; 

JSON.stringify = function(value) { 
    return JSON.stringify2(value, function(key, val) { 
     return (typeof val === 'function') ? val.toString().replace(/\t|\n/g, '') : val; 
    }); 
} 

JSON.parse = function(value) { 
    return JSON.parse2(value, function(key, val) { 
     if (typeof val === 'string') { 
      var regex = /^function\s*\([^()]*\)\s*{.*}$/; 

      if (regex.exec(val) !== null) 
       return eval('key = ' + val); 
      else 
       return val; 
     } else 
      return val; 
    }); 
} 

var storage = {}; 

storage.set = function(key, value) { 
    if (typeof value === 'object') 
     value = JSON.stringify(value); 

    localStorage.setItem(key, value); 
} 

storage.get = function(key) { 
    var value = localStorage.getItem(key); 

    try { 
     return JSON.parse(value); 
    } catch (e) { 
     return value; 
    } 
} 
+0

Overriding Eingeborene ist eine schlechte Praxis. Erwägen Sie stattdessen, neue Funktionen zu erstellen. – neeh