javascript 中有没有办法让运行时在错误消息中使用不同的对象表示。
典型的错误信息
Uncaught TypeError: Object [object Object] has no method 'toggle'
如果我们可以为对象提供比[object Object]
。在其他语言中,您可以通过覆盖toString()
.
但是,在这种情况下,覆盖 toString 似乎没有效果。
javascript 中有没有办法让运行时在错误消息中使用不同的对象表示。
典型的错误信息
Uncaught TypeError: Object [object Object] has no method 'toggle'
如果我们可以为对象提供比[object Object]
。在其他语言中,您可以通过覆盖toString()
.
但是,在这种情况下,覆盖 toString 似乎没有效果。
我会使用 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
这是该Object.prototype.toString
方法的一个限制,它似乎负责创建[object Object]
您在这些 TypeErrors 中看到的符号。尽管您可以覆盖全局的toString
原型Object
,但被覆盖的原型并不是最终被 TypeErrors 等中的本机代码调用的。
这里有更多解释为什么选择该特定符号以及为什么它不能被覆盖。实际上,错误消息格式更多的是 Javascript 编译器和/或实现的一部分,而不是 Javascript 本身的一部分!
该消息取决于浏览器。除了切换到 chrome 之外,无需进行任何更改,您会收到一条更好的消息,报告您正在使用的对象类型。
如果您的目标是将纯 javascript 对象转换为字符串,那么
JSON.stringify(object)
工作绝对很棒。它的文档在这里。
但是我在您提到的错误消息中看到“切换”,我假设它是在 DOM 对象上执行的通用JQuery 切换。在这种情况下 JSON.stringify() 不起作用。
要将 DOM 对象转换为字符串,请遵循此 stackoverflow 帖子
也许你也可以试试Object.toSource()
(我猜它只在 Firefox 中有效)
像这样的东西应该工作:
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)