[英]JSON.stringify function
我有一個 object 有一些屬性和方法,像這樣:
{name: "FirstName",
age: "19",
load: function () {},
uniq: 0.5233059714082628}
我必須將這個 object 傳遞給另一個 function。 所以我嘗試使用 JSON.stringify(obj) 但是負載 function (當然不是空的,這只是為了這個例子的目的)正在“丟失”。
有什么方法可以對 object 進行stringify
並維護它的方法嗎?
謝謝!
有一種方法可以在 JS 中序列化 function,但您必須在另一側對其進行評估,並且它也將無法訪問其原始 scope。 一種方法是:
JSON.stringify(objWithFunction, function(key, val) {
if (typeof val === 'function') {
return val + ''; // implicitly `toString` it
}
return val;
});
盡管人們在這里發布了什么,但您所詢問的內容仍有一些合法用途,但是,這完全取決於您將使用它的目的。 無論您嘗試做什么,都可能有更好的方法。
為什么要對 object 進行字符串化? 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);
不是我會做的事情,但值得一提的是,有一些方法可以對 function 進行字符串化(即並非不可能)。
采取以下措施:
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()
可以實現淺字符串化 function;
免責聲明:查看這篇文章和其他文章並在使用eval()
之前做出自己的決定
這是我在以前的項目中使用的一些代碼,可能有用嗎?
// 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);
使用它時需要注意的是,如果 function 在外部閉包中使用任何東西,它將不起作用,即:... obj: {..., key: (function() {...var a = 10;. .. return function() {... some code uses 'a'...})()}
您可以覆蓋toJSON()
方法,該方法將 function 序列化為另一個 object。 這是一個將 function 轉換為字符串的示例:
Function.prototype.toJSON = Function.prototype.toString; var o = {name: "FirstName", age: "19", load: function () {}, uniq: 0.5233059714082628}; console.log(JSON.stringify(o,null,4))
如果你想打印,比如說,屬性描述符:
Function.prototype.toJSON = function() { return Object.getOwnPropertyDescriptors(this); } var o = {name: "FirstName", age: "19", load: function () {}, uniq: 0.5233059714082628}; console.log(JSON.stringify(o,null,4))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.