2012-01-09 52 views
2

我想我可能發現了Google Chrome(16.0.912.75米,這是撰寫本文時的最新版本)的錯誤。什麼是使用log()顯示的Chrome控制檯?

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 for Windows(5.1.2 7534.52.7),並且都顯示爲「Object」。

我懷疑它試圖做一些猜測構造函數被調用的地方。匿名構造函數的間接性是如何搞亂它的?

+1

如果你的問題只是關於前兩行和它們的輸出,你爲什麼要包含如此多的代碼? (「但我無法弄清Chrome作爲第一行列出的是什麼。」)我一定是誤解了...... – Domenic 2012-01-10 00:02:15

+0

對不起,添加了清晰度編輯。記錄每個對象的第一行。 – 2012-01-10 00:23:18

回答

1

第一行是

console.log(new FakeFancy()); 

結果WebKit的控制檯通常試圖做「構造函數名稱推斷」,讓你知道它的輸出什麼類型的對象。我的猜測是,包括Chrome瀏覽器的最新版本(而不是Safari瀏覽器5.1)可以用於構造函數聲明做推理像

var FakeFancy = function() {}; 

,而不僅僅是那些像

function FakeFancy() {} 

所以這就是爲什麼你看到差距。

相關問題