1. 程式人生 > >Function.__proto__ === Function.prototype 引發了我胡亂的哲學思考

Function.__proto__ === Function.prototype 引發了我胡亂的哲學思考

chrom 目前 字母 可能 理解 c++程序 就是 函數 內置對象

前兩天我又試圖順著__proto__和prototype尋找JavaScript宇宙的本源,最後還是不出意料的瘋了。

我沒瘋,經過無數次的測試,我偶然發現了這樣一個令人奇怪的現象:

在chrome控制臺中, Function.__proto__ === Function.prototype返回的是true,這就引發了我的思考。

技術分享圖片

思考了兩三天,又刷了一遍MDN相關部分,有了新的收獲。

Function,從小往大說,應該是:構造函數——函數——對象。

1、Function是一個構造函數,通過new調用可以生成函數對象,即我們一般自定義的那種函數。所以Fucntion這個構造函數的prototype是所有函數的__proto__,有call, apply等方法。下圖證實了這個說法:

技術分享圖片

2、Function是一個函數,因為構造函數是一種特殊的函數(可通過new調用)。既然它是一個函數,那麽按照上面的說法【Fucntion這個構造函數的prototype是所有函數的__proto__】,就有

Function.__proto__ === Function.prototype。在我之前的理解中,形如 a.__proto__ === b.prototype 的情況成立,幾乎只有一種可能,那就是:b為構造函數, a是b的實例。把這個可能代入到這裏,就是Function是Function的實例,先有Function才有Function,顯然不是這樣的。所以,Function並不是通過構造函數Function創建的,JavaScript的宇宙中也沒有哪個對象必須通過構造函數創建。而且構造函數這種東西在JS裏本來就很別扭,人們總說ES6的class是向Java、C++程序員妥協,我覺得可能大寫字母開頭的構造函數也是這樣的妥協吧。Function這個內置的函數/構造函數有什麽用呢?有人用它來創建函數嗎?可能它目前唯一的作用就是掛著所有函數對象的prototype。往大了說,所有的構造函數都是為了讓那一類實例對象有個地方好找它們的原型,順便騙騙Java程序員,哈哈。

3、Function是JS的一個內置對象。之前我對MDN左側目錄的【內置對象】四個字頗有微詞,因為在我相信中JS內置的無非是Object、Number、Array等構造函數,叫【內置構造函數】不是更好?現在我又想想,一句妙語脫口而出:這世界上根本就沒有食神,或者說人人都是食神

Function.__proto__ === Function.prototype 引發了我胡亂的哲學思考