Что отображает консоль Chrome с log ()? - PullRequest
2 голосов
/ 10 января 2012

Я думаю, что, возможно, обнаружил ошибку в Google Chrome (16.0.912.75 м, последняя стабильная на момент написания статьи).

var FakeFancy = function () {};
console.log(new FakeFancy());

var holder = {
    assignTo : function (func) {
        holder.constructor = func;
    }
};

holder.assignTo(function () { this.type = 'anonymous' });
var globalConstructor = function () { this.type = 'global' }

console.log(new holder.constructor());

Если вы запускаете этот блок в Firefox, он показывает оба в списке как «Объект», а второй имеет тип = локальный, довольно хорошо. Но если вы запустите его в Chrome, он покажет

> FakeFancy
> globalConstructor.type

Если вы расширите деревья, содержимое будет правильным. Но я не могу понять, что Chrome перечисляет в качестве первой строки для каждого зарегистрированного объекта. Поскольку я не манипулирую прототипами, это должны быть простые старые объекты, которые нигде не наследуются.

Сначала я думал, что это связано с WebKit, но я попробовал в последнем Safari для Windows (5.1.2 7534.52.7), и оба отображаются как «Объект».

Я подозреваю, что он пытается угадать, откуда был вызван конструктор. Неправильная ли анонимность конструктора портит это?

1 Ответ

1 голос
/ 10 января 2012

Первая строка является результатом

console.log(new FakeFancy());

Консоль WebKit обычно пытается сделать «вывод имени конструктора», чтобы вы знали, какой тип объекта он выводит. Я предполагаю, что более поздняя версия, включенная в Chrome (в отличие от Safari 5.1), может сделать вывод для объявлений конструктора, таких как

var FakeFancy = function () {};

, а не только такие, как

function FakeFancy() {}

так вот почему вы видите несоответствие.

...