JSON.stringify function

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I have an object that has some properties and methods, like so:

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

and I have to pass this object to another function. So I tried to use JSON.stringify(obj) but the load function (which of course isn't empty, this is just for the purpose of this example) is being "lost".

Is there any way to stringify and object and maintain the methods it has?

Thanks!

回答1:

Why exactly do you want to stringify the object? JSON doesn't understand functions (and it's not supposed to). If you want to pass around objects why not do it one of the following ways?

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


回答2:

There is a way to serialize a function in JS, but you'll have to eval it on the other side and it will also lose access to it's original scope. A way to do it would be:

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

There are some legitimate uses for what you're asking despite what people are posting here, however, it all depends on what you're going to be using this for. There may be a better way of going about whatever it is you're trying to do.



回答3:

In fact, It's very easy to serealize / parse javascript object with methods.

Take a look at JSONfn plugin.

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

Hope this helps.

-Vadim



回答4:

Not something I would ever do but it is worth mentioning that there are ways to stringify function (i.e. it is not impossible).

Take the following:

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

The above with an overridden toJSON() can achieve a shallow stringified function;

DISCLAIMER: look into this and other articles and make your own decision before using eval()



回答5:

Here's some code I have used in my previous projects, maybe useful?

  // 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); 

One Caveat when using this is that if the function uses anything in external closure, it won't work, ie: ... obj: {..., key: (function() {...var a = 10;... return function() {... some code uses 'a'...})()}



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!