2013-02-27 23 views
1

任何人都可以解釋一下爲什麼這些代碼可以檢查數據類型嗎?他們對我沒有意義。我無法理解這些場景背後的代碼。提前致謝!爲什麼.toString可以檢查數據類型?

var toClass = {}.toString // {} is for what? toString is a method? 

alert(toClass); // alert it I get a function? = > function toString() {[native code]} 

alert(toClass.call([1,2])) 
alert(toClass.call(new Date)) 
+1

'cos它是這樣設計的,由JS引擎實現嗎?這就像問,爲什麼地球是圓的?因爲它是以這種方式創建的。投票結束爲非建設性的。 – 2013-02-27 08:52:09

+0

是的,['toString'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/toString)是一個函數。 – Bergi 2013-02-27 09:05:15

回答

6
var toClass = {}.toString; 

相當於

var toClass = Object.prototype.toString; 

因爲

{} 

作爲表達Object初始化劑)等效於

new Object() 

其中Object是「具有該名稱的標準內置構造函數」(ECMAScript Language Specification, 5.1 Edition, section 11.1.5;和更早的版本)。

所以{}代表對新的Object實例的引用。默認情況下,Object實例通過原型鏈(section 15.2.5)從Object.prototype最初引用的對象繼承屬性,其中包括內置屬性Object.prototype.toString。該屬性值最初是對Function實例的引用,即屬性是您可以調用的方法(section 15.2.4.2)。

alert實際上是window.alert(應該這樣寫)。 window是ECMAScript全局對象的屬性;該屬性引用的對象是作用域鏈中具有alert方法的主機對象。 ECMAScript中沒有指定這兩者,但是它們是provided by some host environments(通常由瀏覽器),如規範(section 15.1)所允許的。

因爲它被設計來顯示警報消息,所述alert主機方法顯示其第一個參數的字符串表示。對於對象,包括調用它們的toStringvalueOf方法,先選擇哪一個(section 9.8)。Function實例(如{}.toString引用的實例)繼承自己的toString方法,該方法返回函數的實現相關表示形式(section 15.3.4.2)。

儘管如此,ECMAScript概念[[Class]]與「數據類型」的概念有所不同(請參閱typeofinstanceof)。這些是使用基於原型的繼承的語言(section 4.2.1)。

2

這相當於:

Object.prototype.toString.call([1, 2]); 
Object.prototype.toString.call(new Date); 

這裏,Object.prototype.toString是默認toString方法的所有對象默認情況下繼承。當被調用時它打印是這樣的:

[object XXX] 

{}.toString類似於在這裏,因爲{}是短期的new Object()

派生的對象可以自由地重寫toString方法來滿足他們的需求,例如:

> [1, 2].toString() 
"1,2" 

> (new Date).toString() 
"Wed Feb 27 2013 17:03:42 GMT+0800 (Malay Peninsula Standard Time)" 

但是,您仍可以通過在任Object.prototype.toString{}.toString藉此使用.call()用「原始」的方法使用.call()的第一個參數來定義this在您調用的方法內引用的內容。

+0

您對「傳統OOP」的概念在區分和實施上都是錯誤的。它可以以基於類的OOP完全相同的方式工作,只是該對象將從類繼承,而不是從原型對象繼承。 – PointedEars 2013-02-27 09:10:20

+0

@PointedEars很好,刪除了OOP參考。無論如何,這並不是真的有必要。 – 2013-02-27 09:16:53

+0

這是原因之一,但你編輯的版本足以讓我恢復投票。 – PointedEars 2013-02-27 09:54:03

相關問題