我想我可能发现了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中运行该块,它会显示两个列为“对象”,第二个列出type = local,非常好。但如果您在Chrome中运行它,则会显示
> FakeFancy
> globalConstructor.type
如果展开树,则内容正确无误。但我无法弄清楚Chrome列出的内容是每个记录对象的第一行。因为我没有操纵原型,所以这些应该是不是从任何地方继承的普通旧对象。
起初,我认为这与WebKit有关,但我尝试使用最新的Safari for Windows(5.1.2 7534.52.7)并且都显示为“对象”。
我怀疑它试图对构造函数的调用位置做一些猜测。匿名构造函数的间接是否会搞乱它?
答案 0 :(得分:1)
第一行是
的结果console.log(new FakeFancy());
WebKit控制台通常会尝试执行“构造函数名称推断”,以便让您知道它输出的对象类型。我的猜测是Chrome中包含的最新版本(与Safari 5.1相对)可以对构造函数声明进行推理,例如
var FakeFancy = function () {};
而不仅仅是
之类的function FakeFancy() {}
这就是为什么你会看到这种差异。