2012-06-16 3 views
6

Я работаю с некоторыми объектами, которые содержат несколько данных для отображения и обработки из браузера, и я хочу сохранить их в локальном хранилище. Для того, чтобы сохранить объекты, которые я использовал JSON.stringify(), так что все становится текст, и он хорошо работаетсохранить функцию в localstorage

{ 
"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" 
} 
} 

Теперь я пытаюсь сохранить также функцию путем преобразования его в строку, а затем его

сохранение на носители
JSON.stringify(myFunction.toString()); 

но выход этого

"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}" 

ли это правильный путь, чтобы сохранить функцию в локальном хранилище или есть лучший способ сделать это? Если это правильный способ, есть ли способ просто удалить любой символ табуляции/отступов или я должен манипулировать строкой, например, используя некоторую функцию регулярного выражения?

+0

Вы хотите сохранить объект под строкой или подписать функцию? Какой результат вы ожидаете? – Sarfraz

+0

Почему вы хотите сохранить функцию? По-моему, нет «правильного» способа сделать это, потому что на самом деле не имеет смысла делать это вообще. Предполагая, что вы хотите сохранить версию функции .toString() ', почему вы хотите удалить вкладки (что вы могли бы сделать с' .replace() ')? – nnnnnn

ответ

5

Функция в JS, как и во многих функциональных языках, является закрытием: они обертывают внутри себя содержимое области окружения в момент определения, включая эфемерные данные, такие как db или дескрипторы файлов.

Это не очень хорошая идея, потому что это может привести к проблемам из-за поведения десериализации JSON, поэтому вам нужно проверить, что в функции обернуто и что самоопределяется.

См. Также SO thread для получения дополнительной информации.

+0

полезная ссылка и полезный ответ, я постараюсь избежать сохранения функции. спасибо – Naigel

1

Вы можете поместить функцию в объект и использовать функции storage.set и storage.get, которые я создал вместо localStorage.set и localStorage.get (localStorage не позволяет добавлять функции, в отличие от JSON).

storage.set будет строгать объект, включая функции, перед использованием localStorage.setItem().
storage.get будет анализировать объект, включая функции после использования localStorage.getItem().

Я изменил функции JSON.stringify и JSON.parse, чтобы иметь возможность обрабатывать функции, поэтому вы можете использовать его в других частях вашего кода без изменения имен функций. Я добавил 2 к исходным функциям, поэтому я могу использовать их в обновленных функциях.

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

Переопределение аборигенов - плохая практика. Рассмотрите возможность создания новых функций. – neeh