【问题标题】:How to implicitly log a JavaScript object as a string?如何将 JavaScript 对象隐式记录为字符串?
【发布时间】:2013-08-22 07:17:29
【问题描述】:

考虑:

var o = { a: 1, b: 2, toString: function() { return "foo"; } };

在 Chrome 开发工具中:

我可以对对象做些什么,使o 在调试控制台中显示为"foo" 而不是完整对象?

【问题讨论】:

  • .toString() 不够好?我的意思是,如果你想要 o.toString 的返回值,最简单和最干净的方法就是像你一样调用它。
  • 相比之下,在 .NET 中,覆盖 ToString() 将在调试时隐式使用它,即使您不调用 .ToString()。我想知道在 JavaScript 中是否可以实现同样的效果。
  • 你可以很容易地超载console.log,但我正在考虑副作用。
  • 好吧,你可以投射它''+o
  • @elclanrs - 谢谢,这很接近 - 但我想要一种方法将这个 inside 放在对象中,以便隐式转换。

标签: javascript debugging google-chrome-devtools


【解决方案1】:

这是我的尝试:

(function() {
    var cl = console.log;
    console.log = function() {
        cl.apply(console, [].slice.call(arguments).map(function(el) {
            return {}.toString.call(el) === '[object Object]' && typeof el.toString === 'function' && el.toString !== Object.prototype.toString ? el.toString() : el;
        }));
    };
}());

^ 只需在任何 console.log 调用之前抛出此脚本即可。


Test case:

console.log('str', 42, /rege?x/, { a: 1 }, [1, 2], {
        toString: function() { return "foo"; }
    }, new function() {
        this.toString = function() {
            return 'bar';
        };
    }
);


这只是将具有不同于Object.prototype.toStringtoString 方法的普通/构造对象映射到它们的.toString() 值。我选择了这种方式而不是 hasOwnProperty,因为构造函数的原型中也可能有 toString 方法。

如您所见,所有对象甚至基元都从本机构造函数继承 toString 方法,因此您可能需要针对特定​​用例进行调整。例如,上面的 sn-p 不会对具有自定义 toString 属性的函数对象进行字符串化。

【讨论】:

  • 这应该足以满足我能想到的所有常见用例。如果您设法找到任何错误,请随时发表评论。
  • 不错的尝试,这非常接近 - 除非您仍然需要调用 console.log(o) 而不仅仅是 o。我猜调试窗口没有直接通过console.log?
  • 另外,我真的希望我可以将一些东西放在 inside 对象中,这样它就可以连接起来,但不会影响全局的一切。也许这在 JS 中是不可能的?
  • @MattJohnson 哦,我明白了,我以为你指的是console.log,它经常在代码内部使用,至于直接在开发工具上输入它,我相信它无法用普通的 JS 解决.也许可以扩展或覆盖开发工具的某些部分(我见过扩展 Firebug 控制台的扩展,但不确定是否有扩展开发工具控制台的 API)。
  • 可能可以通过chrome.experimental.devtools.console 实现,我会检查是否能从中得到有用的东西。 =]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多