Подтвердить что ты не робот

Сообщения об ошибках Javascript, представление пользовательских объектов

Есть ли способ в javascript, чтобы среда выполнения использовала другое представление объекта в сообщениях об ошибках.

Типичное сообщение об ошибке

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

Было бы полезно, если бы мы могли дать лучшее представление объекту, чем [object Object]. В других языках вы можете заставить его печатать лучшее представление объекта, переопределяя toString().

Однако, похоже, что переопределение toString в этом случае не влияет.

4b9b3361

Ответ 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)