JavaScript之Function 和 Object 的區別和聯系


1、先看一個控制台的輸出:

instanceof 運算符字面意思是 左邊是右邊的一個實例嗎?

但是這兩條輸出讓人很困惑。Function 是 Object 的實例。Object 也是 Function 的實例。

學過靜態語言的人看了一下就蒙了。A是B類 的實例,B又是A的實例。是不是很扯。

實際上instanceof 運算符的意識是:左邊操作數的__proto__原型鏈上是否包括右邊操作數的prototype。

也即如果有表達式:L instance R;

則運算結果是: L.__proto__.__proto__... === R.prototype ?

運算符左邊最終結果是 instanceof運算時會遞歸查找L的原型鏈,即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到頂層為止。

運算符右邊只是找出了 右邊操作數的prototype是什么。

所以一句話總結:instanceof 檢測 左側操作數 的__proto__原型鏈上,是否存在右側的prototype原型。

以上這些看似很有道理,事實上也的確如此。但是Object 和 Function 的關系到底如何?

2、JavaScript的構造器Function 和 Object

首先明白兩點 1)__proto__(原型鏈屬性)是JavaScript中一切對象都有的屬性,它一般指向創建它的函數的prototype屬性(原型)有一點例外(不用函數創建對象,用var a = {}; var b = Object.create(a); 此時,b.__proto__ 指向a 而不是a.prototype,因為a是用字面值創建的對象,沒有prototype屬性。

       2)prototype 是只有函數對象才有的屬性。它的指向一般是

最重要的一點Function.prototype.construtor指向它本身,Object.prototype.construtor也指向Function。

從這里可以說,所有的對象都是由Function生成的。

結論:構造器的原型鏈是封閉的,它借由一個匿名函數實現。即, Function.__proto__指向一個匿名函數function(){} ,匿名函數的__proto__指向Object的prototype ,Object的__proto__指向Function 的 prototype.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM