javascript中的Function和Object,原型与原型链
为了更好的理解本文,请预先学习原型、原型链的基础知识。
那么先看看下面几道坑爹的判断题吧
1 Object.__proto__ == Object.prototype 2 Function.__proto__ == Function.prototype 3 Object instanceof Function 4 Function instanceof Object
可能很多人第一眼就懵了(包括笔者),感觉有点像应试教育的判断题,别着急,慢慢来,首先让我们看看一句再普通不过的代码,var a = new A();用脚趾都知道是在内存中创建了A的一个实例a,那么在创建这个实例的过程中new关键字做了哪些事情呢?
1 var a = {}; //建立一个空对象 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