2012-10-14 61 views
3

我一直在閱讀Stoyan Stefanov所着的「Object Oriented Javascript」一書。我看到這句話:函數和對象Javascript

函數實際上是一個用'函數'構造函數(大寫字母F)構建的對象。

作者用一些很好的例子證明了這一點。然而,根據這一陳述,我得到了這個不能由我自己回答的問題。作爲「功能」的構造是一個功能,所以「功能」 功能對象,則「功能」 對象需要另一個構造函數來建立它和另一個構造函數又是一個對象(因爲它是一個函數)。

那麼,我結束了這種無盡的邏輯。有人能幫我指出我思想中的錯誤點嗎?

+7

'Function.constructor === Function' - 但本地對象是通過環境提供的,而不是通過腳本,所以這就是爲什麼這是可能的。 – pimvdb

回答

3

「功能」的功能是一個對象,然後「功能」對象需要另一個構造函數建立它

Function是天然,內置對象,其屬性和行爲在section 15.3 of the EcmaScript specification中定義。它不是由js函數構建的。

想一想:EcmaScript環境的代碼中有一個函數會建立函數對象 - 只要您的腳本遇到函數表達式或聲明,就會調用它。全局函數Function是該函數的一個包裝函數,使其可以訪問腳本。該函數返回的所有函數對象都從Function.prototype對象繼承 - 看起來它們是由Function構造的。此外Function.prototype.constructor財產,所有功能繼承is defined指向Function

0

在JS的函數嵌入2個概念:

  1. 實體
  2. 甲功能

甲功能實體是某種含有官能度「膠囊」,即,功率將多個輸入轉換爲輸出。這個膠囊就是我們所知道的「物體」。在遞歸結束時,您會發現標識Function.constructor === Function,該標識設置了該語言的內省功能的限制。剩下的JS功能不能被語言本身訪問,因爲不存在嵌入它們的膠囊或對象。

在JS中,您無法定義獨立的「功能」,但是您創建的對象實現了可以視爲任何其他對象的功能。對象是實現功能性對象的核心對象。無論是定義命名函數還是匿名函數(通過關鍵字function),您都將創建一個綁定到名稱(對於命名函數)或直接綁定到變量(未命名函數)的Function對象。

function foo(a, b) { return a+b; } //This function is a Function object bound to the name `foo` 

var a = function(a, b) { return a+b; } //the Function object is bound to `a` 

以相同的方式Array對象具有[]運算符,它被用來訪問數組元素,則可以解釋爲() Function對象的操作者,其用於調用其嵌入功能性。