為了更好的理解本文,請預先學習原型、原型鏈的基礎知識。
那麼先看看下面幾道坑爹的判斷題吧
1 Object.__proto__ == Object.prototype2 Function.__proto__ == Function.prototype3 Object instanceof Function4 Function instanceof Object
可能很多人第一眼就懵了(包括筆者),感覺有點像應試教育的判斷題,別著急,慢慢來,首先讓我們看看一句再普通不過的代碼,var a = new A();用腳趾都知道是在記憶體中建立了A的一個執行個體a,那麼在建立這個執行個體的過程中new關鍵字做了哪些事情呢?
1 var a = {}; //建立一個Null 物件2 a.__proto__ = A.prototype; //讓a的__proto__屬性引用A的prototype屬性,也就是說,將A.prototype添加到a的原型鏈中3 A.call(a);
這裡面a是A的一個執行個體,a的原型鏈包含A.prototype。那麼我們繼續做引申,在javascript中,任何對象都是Object對象的執行個體,所以4.Function instanceof Object是true。
特殊地,javascript中還有Function()這個奇葩的對象,任何function()類型的構造器或者函數都是它的執行個體,我們在執行typeof(Object)居然會得到function,權且可以看做
1 function Object() = {};
像不像一個建構函式?!所以我們可以var obj = new Object();這說明Object是Function的一個執行個體,3.Object instanceof Function也是true。
這裡還要說一下關於instaceof,如果A instaceof B返回true,說明B.prototype在A的原型鏈中,但並不等價於A.__proto__ == B.prototype為true。而對於Function和Object這對奇葩組合而言,則有
1 Object.__proto__ == Function.prototype;2 Function.__proto__ == Function.prototype;3 Function.__proto__.__proto__ == Object.prototype;
所以1.Object.__proto__ == Object.prototype為false,2.Function.__proto__ == Function.prototype為true。
Function是一個特殊的Object。
具體可以參照http://www.cnblogs.com/zzcflying/archive/2012/07/20/2601112.html