一、原型链
原型链主要是通过 __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时。
二、作用域链
待续....
以上个人学习经验总结,如有不对的地方烦请指教,谢谢。
原文地址:https://www.cnblogs.com/lxiang
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。