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);

  这里面aA的一个实例,a的原型链包含A.prototype。那么我们继续做引申,在javascript中,任何对象都是Object对象的实例,所以4.Function instanceof Object是true
  特殊地,javascript中还有Function()这个奇葩的对象,任何function()类型的构造器或者函数都是它的实例,我们在执行typeof(Object)居然会得到function,权且可以看做

1 function Object() = {};

像不像一个构造函数?!所以我们可以var obj = new Object();这说明ObjectFunction的一个实例,3.Object instanceof Function也是true。

  这里还要说一下关于instaceof,如果A instaceof B返回true,说明B.prototypeA的原型链中,但并不等价于A.__proto__ == B.prototypetrue。而对于FunctionObject这对奇葩组合而言,则有

1 Object.__proto__ == Function.prototype;
2 Function.__proto__ == Function.prototype;
3 Function.__proto__.__proto__ == Object.prototype;

所以1.Object.__proto__ == Object.prototypefalse2.Function.__proto__ == Function.prototypetrue


  Function是一个特殊的Object。
  具体可以参照http://www.cnblogs.com/zzcflying/archive/2012/07/20/2601112.html

 

posted @ 2013-04-14 16:56  FingerDancing  阅读(239)  评论(0编辑  收藏  举报