Получить более полезное значение, чем "[объект объекта]" для отладки?
В 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
имеет свое назначение. и следует использовать так, как это было задумано.