Функция JSON.stringify - PullRequest
32 голосов
/ 20 июля 2011

У меня есть объект, который имеет некоторые свойства и методы, например:

{name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628}

и я должен передать этот объект другой функции. Поэтому я попытался использовать JSON.stringify (obj), но функция загрузки (которая, конечно, не пустая, это только для целей данного примера) «теряется».

Есть ли способ stringify и объект и поддерживать методы, которые у него есть?

Спасибо!

Ответы [ 5 ]

58 голосов
/ 20 июля 2011

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

JSON.stringify(objWithFunction, function(key, val) {
  if (typeof val === 'function') {
    return val + ''; // implicitly `toString` it
  }
  return val;
});

Существуют некоторые законные способы использования того, о чем вы спрашиваете, несмотря на то, что люди публикуют здесь, однако все зависит от того, что вы собираетесь использовать, этоза.Может быть, есть лучший способ сделать то, что вы пытаетесь сделать.

9 голосов
/ 07 сентября 2012

На самом деле очень просто разобрать / разобрать javascript объект с помощью методов .

Взгляните на JSONfn плагин.

http://www.eslinstructor.net/jsonfn/

Надеюсь, это поможет.

-Vadim

5 голосов
/ 20 июля 2011

Почему именно вы хотите преобразовать объект в строку?JSON не понимает функций (и не должен).Если вы хотите обойти объекты, почему бы не сделать это одним из следующих способов?

var x = {name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628};

function y(obj) {
    obj.load();
}

// works
y({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628});

// "safer"
y(({name: "FirstName", age: "19", load: function () {alert('hai')}, uniq: 0.5233059714082628}));

// how it's supposed to be done
y(x);
3 голосов
/ 30 марта 2015

Не то, что я бы когда-либо делал, но стоит упомянуть, что есть способы структурировать функции (то есть это не невозможно).

Примите следующее:

var func = function(){console.log('logged')};
var strFunc = func.toString();

//then
var parsedFunc = eval('('+strFunc+')');
parsedFunc();

//or simply
eval('('+strFunc+')()');
//or
eval('('+strFunc+')')();
//or
eval('var anotherFunc='+strFunc);
anotherFunc()

Вышеуказанное с переопределением toJSON() может обеспечить мелкую строковую функцию;

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : изучите эту и другие статьи и примите собственное решение перед использованием eval()

0 голосов
/ 16 апреля 2015

Вот какой-то код, который я использовал в моих предыдущих проектах, может быть, полезен?

  // Similar to JSON.stringify(), with three major differences:
  // (1) It also wrap functions
  // (2) Upon execution, it expose an object, nl, into the scope
  // (3) Results are minified by 'uglify-js'
  var bundle = function(obj) {
    var type = typeof obj;
    if(type === 'string') return '\'' + obj + '\'';
    if(type === 'boolean' || type === 'number') return obj;
    if(type === 'function') return obj.toString();
    var ret = [];
    for(var prop in obj) {
      ret.push(prop + ': ' + bundle(obj[prop]));
    }
    return '{' + ret.join(',') + '}';
  };
  var ret = 'var nl = ' + bundle(nl);
  ret = require('uglify-js').minify(ret, {fromString: true}).code;
  fs.writeFileSync('nl.js', ret);

Одно предостережение при использовании этого заключается в том, что если функция использует что-либо во внешнем закрытии, она не будет работать, то есть: ... obj: {..., key: (function () {... var a = 10; ... return function () {... в некотором коде используется 'a' ...}) ()}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...