2010-10-15 57 views
3

我是一個自學Web開發人員,我仍然試圖掌握一些JavaScript基礎知識。以下是從Douglas Crockford的Good Parts中摘錄的一些引用。功能真的是一個對象

「在JavaScript函數是對象」

「在JavaScript中,陣列是對象,函數是對象,正則表達式是對象,並且,當然,對象是對象」

「每個對象鏈接到它可以繼承屬性的原型對象」(即構造函數,toString,...)

如果Function是一個對象,那麼爲什麼

console.log(typeof Function); // function 

是其類型的函數,而不是對象

console.log(Object.constructor); // Function() 

是其 '父'

console.log(Function.constructor); // Function() 

的構造困惑所以解釋ctor實際上是一個功能?

console.log(typeof Function.prototype); // Function 

是其原型的類型的函數,而不是一個對象? 我以爲它繼承了對象

回答這些問題將大大有助於我對JavaScript的理解。

回答

9

如果Function是一個對象,那麼爲什麼它的類型是一個函數而不是對象?

由於typeof運算符被定義那樣,大概爲可用性:

  • 對象(天然的和沒有實現[[調用]])返回 「對象」
  • 對象(天然的或主機並執行[[Call]])返回「函數」
  • 對象(主機並沒有實現[[Call]]) 返回實現定義的值,該值可能不是「未定義」,「布爾值」,「數字「或」字符串「。

[[Call]]是將對象標識爲函數(可調用)的對象的內部屬性。非本地對象是由主機(例如瀏覽器)提供的對象,例如DOM對象或ActiveXObject的實例。

困惑所以構造函數實際上是一個函數?

爲什麼不呢?構造函數是函數。實例只能使用函數構造。 Object.constructor是一個函數,但它也是一個對象。參閱以下內容:

console.log((function() { }) instanceof Object); 
//-> true 

此外,從ECMAScript的speficiation:

每個內置函數和每個內置構造所具有的功能的原型對象,其是表達功能的初始值。原型(15.3.4)作爲其[[Prototype]]內部屬性的值。

除非另有規定,否則每個內置原型對象都有Object prototype原型對象,它是表達式Object.prototype(15.2.4)的初始值,作爲其[[Prototype]]內部屬性的值,除Object原型對象本身。

而且也回答你最後的困惑:

函數原型對象本身就是一個函數對象(它的[[等級]爲「功能」),其被調用時,接受任何參數並返回undefined。

+1

+1感謝這個解釋真的使事情變得更加清晰。 – 2010-10-15 11:42:19

4

當我們說「一個函數是一個對象」時,我們不是指「是」,而是「代替」,我們的意思是它與「貓是動物」的意思相同。如果有人問你是什麼樣的寵物,你不會回答「一隻動物」。如果它總是迴應object,那麼typeof將毫無用處。

函數是一個對象,但這對於typeof的返回並不是一件有趣的事情,因爲它是語言本身的靜態質量,而不是在運行時需要報告的東西。

1

如果typeof運算符總是返回「object」,那麼它將毫無用處,不是嗎?一切都是一個對象,但它也可能是其他的東西。例如,一個字符串是一個對象,但它也是一個字符串:)操作符返回最具體的類型的名稱,而不是最普通的類型。這應該解釋爲什麼typeof Function是「功能」。

至於constructor屬性,構造函數是在創建對象時由運算符new調用的函數。無論對象本身是否爲Object,Function或其他,它總是一個函數。

+2

基元 - 字符串,數字和布爾值 - 不是對象,而是在嘗試訪問對象的屬性或方法時隱式轉換爲對象。例如''jim「instanceof Object'將返回false,但是'new String(」jim「)instanceof Object'將返回true。 – 2010-10-15 11:36:33

0

console.log(typeof Function);顯示該對象的類型爲Function而不是object

爲了給出一個例子:

function squareValue(var x) { 
    return x * x; 
} 

可以鬆散地翻譯爲

var squareValue = new Function("x", "return x*x"); 

,因此,這樣做

var valueSquared = squareValue(x); 
在任何這些2個實例

,會產生相同的結果...

因此,爲什麼Javascript中的每個函數都是一個Function對象。

.constructor,.prototype,.toString關於javascript對象/函數都是在它們各自的對象中的函數,因此爲什麼你的輸出爲「函數」。

這是根據ECMA-262 3rd Edition -December 1999

希望這有助於爲主。

0

參考Is every JavaScript Object a function?

javascript:alert([ window.navigator.userAgent, Object, Function ].join("\n\n")) 

顯示器

Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 
     Ubuntu/10.04 (lucid) Firefox/3.6.3 

function Object() { 
    [native code] 
} 

function Function() { 
    [native code] 
} 

javascript:alert([ new Object, new Function ].join("\n\n")) 

顯示器

[object Object] 

function anonymous() { } 

javascript:alert([ new new Function ].join("\n\n")) 

顯示

[object Object] 
相關問題