Javascript错误消息,自定义对象表示

时间:2013-11-09 15:52:40

标签: javascript

javascript中是否有一种方法可以使运行时在错误消息中使用不同的对象表示。

典型的错误消息

Uncaught TypeError: Object [object Object] has no method 'toggle'

如果我们可以为对象提供比[object Object]更好的表示,将会很有帮助。在其他语言中,您可以通过覆盖toString()来打印更好的对象表示。

然而,在这种情况下,重写toString似乎没有效果。

6 个答案:

答案 0 :(得分:4)

我会使用try...catchthrow您自己的错误消息:

var obj = {
  name: 'obj',
  fn: function () {
    return 'hallo';
  }
}


function hasMethod(obj, fn) {
    try {
        if (!obj[fn]) {
            var err = obj.name + ' does not have a method ' + fn;
            throw new Error(err)
        }
    } catch (e) {
        console.log(e)
    }
}

hasMethod(obj, 'moose'); // obj does not have a method moose

Fiddle

答案 1 :(得分:1)

该消息取决于浏览器。除了切换到chrome之外,不进行任何更改,您会收到一条更好的消息,报告您正在使用的对象类型。

答案 2 :(得分:1)

这是Object.prototype.toString方法的限制,这似乎是负责创建您在那些TypeErrors中看到的[object Object]表示法。虽然您可以覆盖toString全局Object原型,但被覆盖的原型并不会最终被TypeErrors中的本机代码调用。

Here's a bit more explanation for why that specific notation was chosen,此处为why it can't be overridden。实际上,该错误消息格式是Javascript编译器和/或实现的一部分,而不是Javascript本身的一部分!

答案 3 :(得分:0)

如果您的目标是将普通的javascript对象转换为字符串,那么

JSON.stringify(object) 

非常棒。它的文档是here

但是我在你提到的错误消息中看到“切换”,我假设它是在DOM对象上执行的通用JQuery toggle。在这种情况下,JSON.stringify()不起作用。

将DOM对象转换为字符串,请点击this stackoverflow post

答案 4 :(得分:0)

也许你也可以尝试Object.toSource()(我猜它只适用于firefox)

答案 5 :(得分:-3)

这样的事情应该有效:

Object.prototype.toString = function() {
  return '(OBJECT: ' + this.name + ')';
};

foo = { name: 'foo' };
bar = { name: 'bar' };
baz = {}

foo.thing(); // TypeError: Object (OBJECT: foo) has no method 'thing'
bar.thing(); // TypeError: Object (OBJECT: bar) has no method 'thing'
baz.thing(); // TypeError: Object (OBJECT: undefined) has no method 'thing'

(节点js)