Подтвердить что ты не робот

Функция JSON.stringify

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

Почему именно вы хотите укрепить объект? 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 supposed to be done
y(x);

Ответ 2

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

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

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

Ответ 3

На самом деле, очень легко выполнить сериализацию/разбор javascript с помощью методов.

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

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

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

-Vadim

Ответ 4

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

Возьмите следующее:

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()

Ответ 5

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

  // 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'...})()}