将包含函数体的 JavaScript 对象转储为 "good enough" 可格式化代码
Dump JavaScript object including function bodies as "good enough" formattable code
有很多关于转储 JavaScript 对象的老问题。
但是在指定转储函数内容的那些中,我只能找到将这些函数作为字符串发出的那些引号(内部引号转义)。
我想要的 是一种以普通的旧 JavaScript 格式完整转储对象(包括函数)的东西 可以漂亮地打印出来.
- 我不需要像之前的一些问题一样需要完整的序列化和反序列化。
- 我做需要将对象视为文本。仅使用
console.log()
需要交互来展开对象成员等。在 console.log()
之后将控制台缓冲区保存为文本不会导致可以漂亮打印的纯 js 语法。
- 为无法转储的引用(循环引用、DOM 引用等)发出占位符等。不应该一碰就吐。
这里的 the naive approach 转储函数文本,但作为引号字符串,漂亮的打印机不会将其格式化为代码:
JSON.stringify(someObject, function(key, val) {
return (typeof val === 'function') ? val.toString() : val;
}, 4);
对于测试对象 {a: 1, b: 'bb', c: "bb", f: function e() {return "x";} }
天真的方法输出:
{
"a": 1,
"b": "bb",
"c": "bb",
"f": "function e() {return \"x\";}"
}
我需要的是:
{
"a": 1,
"b": "bb",
"c": "bb",
"f": function e() {
return "x";
}
}
如果之前的答案之一符合我的要求,我很高兴将其作为副本关闭。我看了很多都找不到。
(用例:为第三方站点制作 TaperMonkey 用户脚本。我需要查看实际公开的内容以找到添加用户脚本挂钩的位置。我将美化输出,打印出来,加载到代码中编辑等)
不要使用 JSON.stringifiy
- JSON 不能表示函数,因此你永远不会让它返回你想要的东西。
由于您只针对特定的浏览器,也许您可以使用 uneval
or .toSource
. If you're not using Firefox, have a look at this polyfill。
您可以通过一些简单的字符串替换来完成此操作。
var obj = {
name: 'Bond',
getName: function() {
return 'James ' + this.name;
},
getDrink: function() {
return "Martini";
}
};
var result = JSON.stringify(obj, function(key, val) {
return (typeof val === 'function') ? val.toString() : val;
}, 4);
result = result
.replace(/"function/g, 'function')
.replace(/}"/g, '}')
.replace(/\n/g, '\n')
.replace(/\"/g, '"');
document.querySelector('pre').innerText = result;
// Or if you actually want it as an object
eval('var obj = ' + result);
console.log(obj);
<pre></pre>
有很多关于转储 JavaScript 对象的老问题。
但是在指定转储函数内容的那些中,我只能找到将这些函数作为字符串发出的那些引号(内部引号转义)。
我想要的 是一种以普通的旧 JavaScript 格式完整转储对象(包括函数)的东西 可以漂亮地打印出来.
- 我不需要像之前的一些问题一样需要完整的序列化和反序列化。
- 我做需要将对象视为文本。仅使用
console.log()
需要交互来展开对象成员等。在console.log()
之后将控制台缓冲区保存为文本不会导致可以漂亮打印的纯 js 语法。 - 为无法转储的引用(循环引用、DOM 引用等)发出占位符等。不应该一碰就吐。
这里的 the naive approach 转储函数文本,但作为引号字符串,漂亮的打印机不会将其格式化为代码:
JSON.stringify(someObject, function(key, val) {
return (typeof val === 'function') ? val.toString() : val;
}, 4);
对于测试对象 {a: 1, b: 'bb', c: "bb", f: function e() {return "x";} }
天真的方法输出:
{
"a": 1,
"b": "bb",
"c": "bb",
"f": "function e() {return \"x\";}"
}
我需要的是:
{
"a": 1,
"b": "bb",
"c": "bb",
"f": function e() {
return "x";
}
}
如果之前的答案之一符合我的要求,我很高兴将其作为副本关闭。我看了很多都找不到。
(用例:为第三方站点制作 TaperMonkey 用户脚本。我需要查看实际公开的内容以找到添加用户脚本挂钩的位置。我将美化输出,打印出来,加载到代码中编辑等)
不要使用 JSON.stringifiy
- JSON 不能表示函数,因此你永远不会让它返回你想要的东西。
由于您只针对特定的浏览器,也许您可以使用 uneval
or .toSource
. If you're not using Firefox, have a look at this polyfill。
您可以通过一些简单的字符串替换来完成此操作。
var obj = {
name: 'Bond',
getName: function() {
return 'James ' + this.name;
},
getDrink: function() {
return "Martini";
}
};
var result = JSON.stringify(obj, function(key, val) {
return (typeof val === 'function') ? val.toString() : val;
}, 4);
result = result
.replace(/"function/g, 'function')
.replace(/}"/g, '}')
.replace(/\n/g, '\n')
.replace(/\"/g, '"');
document.querySelector('pre').innerText = result;
// Or if you actually want it as an object
eval('var obj = ' + result);
console.log(obj);
<pre></pre>