2 回答

TA貢獻1936條經驗 獲得超7個贊
javascript中,“函數”(方法)也是對象。
一切對象都有一個根源。它是Object.prototype。
根源之上再沒有其他根源。Object.getPrototypeOf(Object.prototype)是null。js中除字面量以外的一切引用對象都來自這個“根源”對象。
表達式Object.getPrototypeOf(Function) === Function.prototype的結果是真。這是Function特有的。實際上Function的prototype是一個內置函數,一切函數都派生自這個內置函數,這個內置函數是一個函數工廠。這個內置函數對象的prototype指向“根源”對象。
表達式Object.prototype === Object.getPrototypeOf(Function.prototype)的結果是真。說明了Object跟Function二者之間的聯系,是通過“根源”對象聯系起來的。
Function和Object,既是函數,因為都可以Function()或者Object()這樣的方式執行,又是對象,因為可以Function.a = 'a',Object.a = 'a'這樣賦值。
說它們是函數,是因為他們都是通過上面第4條中說的”內置函數工廠“,派生出來的,因而具備函數的特性。
說他們是對象。是因為他們都是通過上面第1條中的”根源“對象,派生出來的,因此具備對象的特征。
繼續說一下,Function.prototype指向”內置函數“。而Object.prototype指向”根源對象“。
因而new Function會產生一個匿名函數,而new Object產生一個plain object。
他們之間的關系簡單描述就像下面這樣。

TA貢獻1818條經驗 獲得超8個贊
一、從定義的角度來說:
function Function(){}
前者為定義一個js函數
后者為這個函數的名稱
Object為選擇的DOM對象
二、從用法講:
var a = new Object(function(){});
這里a也是function了。
三、總結:
不管是function ,還是new Function(), 還是new Object(function(){}),當解釋器(例如V8)遇到時,則將它們初始化成一個函數(最主要的是給其添加了一個[[call]]屬性)。
添加回答
舉報