javascript 原型链、作用域链的理解

一、原型链

原型链主要是通过 __proto__和prototype两个属性来实现的。(注:由于__proto__是私有属性,很多浏览器都没有开放,以下都是在谷歌浏览器中实现的

1、“类”的__proto__等于其父类的prototype

  例:

var foo=function(){};
alert(foo.__proto__==Function.prototype)  //返回true

2、“类”实例的__proto__等于该“类”的prototype

  例:

var foo=function(){};
var f=new foo();
alert(f.__proto__==foo.prototype)  //返回true

 

3、“类”的Prototype是一个独立的对象。该对象默认是一个Object对象的实例,所以“类”的prototype属性的__proto__属性的值默认等于Object.prototype

  例:

var foo=function(){};
alert(foo.prototype.__proto__==Object.prototype)  //返回true

 

4、因为在JS中Object其实也是Function,所以alert(Object.__proto__==Function.prototype);返回true

 

5、特殊情况

  Object.prototype.__proto__==null//为了防止原型链无限循环的发生

  由此可得:Function.prototype.__proto__.__proto__==null

 

以上关系可以通过下图来表示:

 

小结:__proto__存在的作用——当调用一个“类”实例的某个属性/方法,如果这个属性/方法在当前“类”中未定义(也就是在“类”实例本身没有找到)则会在__proto__中去查找这个属性/方法,如果__proto__中不存在这个属性/方法,继续搜索__proto__.__proto__中去查找,直到找到这个属性/方法或者__proto__等于null时。

 

二、作用域链

待续....

 

 

以上个人学习经验总结,如有不对的地方烦请指教,谢谢。

posted @ 2015-05-26 17:28  lx_  Views(1010)  Comments(0)    收藏  举报