javascript中是否有一种方法可以使运行时在错误消息中使用不同的对象表示。
典型的错误消息
Uncaught TypeError: Object [object Object] has no method 'toggle'
如果我们可以为对象提供比[object Object]
更好的表示,将会很有帮助。在其他语言中,您可以通过覆盖toString()
来打印更好的对象表示。
然而,在这种情况下,重写toString似乎没有效果。
答案 0 :(得分:4)
我会使用try...catch
和throw您自己的错误消息:
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
答案 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)