5

我想確定在JavaScript中生成類名稱的規則。我貼這個腳本到Chrome瀏覽器開發工具控制檯:如何在Chrome開發工具中爲自定義類計算javascript類名稱?

var obj = { 
    Constr : function() { } 
}; 

var obj2 = obj; 
console.log(new obj.Constr()); 
console.log(new obj2.Constr()); 

obj2.Constr2 = function() { }; 
console.log(new obj.Constr2()); 
console.log(new obj2.Constr2()); 

而且這裏的結果在控制檯:

obj.Constr 
obj.Constr 
obj2.Constr2 
obj2.Constr2 

看來,類的名稱是由變量確定的構造函數最初被分配到。我正在尋找CDT用來生成這個名字的準確規則。此外,這與Google Closure Compiler可識別的名稱相同嗎?

我試圖看看我是否可以在Firebug中重現類似的行爲,但我似乎無法獲得在控制檯中打印出來的類名稱。作爲第二個問題,有沒有人知道如何在螢火蟲中看到這個?

回答

3

Javascript中沒有類,因爲它是基於原型的OOP,而不是基於類的。 Chrome顯然做了一些演繹,以便在控制檯中打印對象的一些描述,但這不是標準的Javascript - 在標準中,對象沒有命名類,並且你不能找出對象所屬類的名稱,因爲唯一的繼承是通過實際的[[Prototype]]內部僞屬性完成的,這個內部僞屬性本身也是一個對象,沒有名稱或「類」。通常,您可以通過查看object.__proto__.constructor.name來推斷出類似於類名的東西,該名稱將返回該對象實例化的構造函數的名稱; 此函數可能是匿名的,您的瀏覽器可能不支持非標準的__proto__屬性,對象的原型可能不包含對其構造函數的正確引用。一般來說,你不能知道JS中對象的「類」;您只能測試下降(object instanceof Constructor),但仍然按照對象原型中的constructor屬性執行,其中可能不正確。

+1

所以,正如我擔心的那樣,CDT打印的名字並不來自ecmascript規範。這對開發人員來說只是一種調試方便。我對JavaScript相當陌生,我一般都喜歡原型風格,但是我發現像dojo和extjs這樣的圖書館試圖用OO風格的編程來解決問題讓人失望。我認爲這混淆了Javascript的一個更好的功能。 –

+1

Javascript是一種_very_ OO語言,實際上它非常靈活。有很多庫在Javascript的基礎上構建了一個典型的基於類的OO,並且通常工作得很好。對於這些庫或Javascript本身來說,這不一定是壞事。 – lanzz

相關問題