Сообщения об ошибках Javascript, представление пользовательских объектов
Есть ли способ в javascript, чтобы среда выполнения использовала другое представление объекта в сообщениях об ошибках.
Типичное сообщение об ошибке
Uncaught TypeError: Object [object Object] has no method 'toggle'
Было бы полезно, если бы мы могли дать лучшее представление объекту, чем [object Object]
. В других языках вы можете заставить его печатать лучшее представление объекта, переопределяя toString()
.
Однако, похоже, что переопределение toString в этом случае не влияет.
Ответы
Ответ 1
Я бы использовал 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
Fiddle
Ответ 2
Сообщение зависит от браузера. Без каких-либо изменений, кроме переключения на хром, вы получаете более приятное сообщение, сообщающее тип объекта, который вы использовали.
Ответ 3
Это ограничение метода Object.prototype.toString
, что, как представляется, отвечает за создание обозначений [object Object]
, которые вы видите в этих TypeErrors. Хотя вы можете переопределить прототип toString
для Object
global, переопределенный прототип - это не тот, который заканчивается тем, что вызывается вызываемым кодом в TypeErrors и т.п.
Здесь немного больше объяснений, почему это конкретные обозначения была выбрана и здесь почему это не может быть отменено. Эффективно, что формат сообщения об ошибках является скорее частью компилятора и/или реализации Javascript, чем частью самого Javascript!
Ответ 4
Если ваша цель - преобразовать простой объект javascript в строку, то
JSON.stringify(object)
работает отлично. Документация для него здесь.
Но я вижу "переключение" в сообщении об ошибке, которое вы упомянули, я предполагаю, что это общий JQuery toggle, который выполняется на объектах DOM, В этом случае JSON.stringify() не работает.
Чтобы преобразовать объект DOM в строку, следуйте fooobar.com/questions/95877/...
Ответ 5
Возможно, вы также можете попробовать Object.toSource()
(я думаю, он работает только в firefox)
Ответ 6
Что-то вроде этого должно работать:
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'
(node js)