14

javascript 中有没有办法让运行时在错误消息中使用不同的对象表示。

典型的错误信息

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

如果我们可以为对象提供比[object Object]。在其他语言中,您可以通过覆盖toString().

但是,在这种情况下,覆盖 toString 似乎没有效果。

4

6 回答 6

4

我会使用 atry...catch抛出您自己的错误消息:

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

小提琴

于 2013-11-09T16:19:34.527 回答
1

这是该Object.prototype.toString方法的一个限制,它似乎负责创建[object Object]您在这些 TypeErrors 中看到的符号。尽管您可以覆盖全局的toString原型Object,但被覆盖的原型并不是最终被 TypeErrors 等中的本机代码调用的。

这里有更多解释为什么选择该特定符号以及为什么它不能被覆盖。实际上,错误消息格式更多的是 Javascript 编译器和/或实现的一部分,而不是 Javascript 本身的一部分!

于 2013-11-14T07:17:38.983 回答
1

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

于 2013-11-13T15:55:47.750 回答
0

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

JSON.stringify(object) 

工作绝对很棒。它的文档在这里

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

要将 DOM 对象转换为字符串,请遵循此 stackoverflow 帖子

于 2013-11-20T06:52:29.040 回答
0

也许你也可以试试Object.toSource()(我猜它只在 Firefox 中有效)

于 2013-11-20T15:08:34.183 回答
-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)

于 2013-11-09T16:01:48.777 回答