将包含函数体的 JavaScript 对象转储为 "good enough" 可格式化代码

Dump JavaScript object including function bodies as "good enough" formattable code

有很多关于转储 JavaScript 对象的老问题。

但是在指定转储函数内容的那些中,我只能找到将这些函数作为字符串发出的那些引号(内部引号转义)。

我想要的 是一种以普通的旧 JavaScript 格式完整转储对象(包括函数)的东西 可以漂亮地打印出来.

这里的 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>