Получить более полезное значение, чем "[объект объекта]" для отладки?

В JavaScript не может быть флага среды, чтобы вы могли включить некоторые метаданные для объектов.

Так что вместо этого, когда вы отлаживаете и получаете:

[object Object]

вы получите имя и тип переменной:

[foo String]

почему это невозможно?

3 ответа

JSON.stringify это может быть то, что вы ищете, хотя оно не даст вам имя переменной - JavaScript просто не может сделать это без сторонних инструментов.

Функция конструктора вашего объекта может быть достигнута с помощью его constructor свойство, хотя нет никакой гарантии с этим, поскольку свойство конструктора доступно для записи.

Вы также можете посмотреть в debugger заявление.

Чтобы прямо ответить на ваш вопрос о том, чтобы просто щелкнуть "глобальный флаг" вместо изменения методологии отладки:

Предполагая, что вы будете делать это только во время отладки, вы можете временно переопределить Object.prototype.toString вернуть JSON-представление объектов:

Object.prototype.toString = function () { return JSON.stringify(this); };

Затем в консоли браузера:

var obj = { a: 42 };
console.log('My object: ' + obj);

Дам тебе:

Мой объект: {"a":42}

Даже если это ответит на ваш вопрос, я не рекомендую глобальное переопределение базового метода, потому что он может вызвать катастрофические проблемы. Попробуйте положиться на модульные тесты и точки останова + отладку, как другие предложили в комментариях.

Немного странно, но это может помочь вам найти источник вашего объекта:

function Foo()
{}

var toClass = function(a)
{
    var _name = a.constructor.toString().match(/^function (\w+)/i); //\w probably should be enhanced
    console.log(_name[1])
}

toClass( new Foo()) //Foo
toClass( [1, 2]) //Array
toClass( new Date()) //Date
toClass( {"a":2}) //Object

Примечание в сторону: не переопределять toString только для отладки. toString имеет свое назначение. и следует использовать так, как это было задумано.

Другие вопросы по тегам