今天看了阮一峰老师的Javascript继承机制的设计思想,终于明白了,纠结了我一上午时间~~
谈到prototype与__proto__,首先理解它们出现的原因。
1、Js的历史
1994年,因为Navigator发布,在当时是第一个比较成熟的网络浏览器,可惜的是它不具备与用户交互的能力,这导致在用户使用频繁的功能上,如注册登录会浪费大量的时间与服务器资源。
此时网景公司急需一种可以与用户交互的语言,随后工程师Brebnda Eich便负责开发这种语言。起初他的想法是设计没必要复杂,能完成简单的操作就行了。
在设计中因为Javascript中都是对象,Brebnda Eich经过思考后决定采用了C++和Java中的new命令来生成对象,采用后新的问题出现了,构造函数生成的对象,无法共享属性和方法。
2、prototype属性的引入
prototype属性包含一个对象,所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面,实例对象一旦创建,自动(__proto__)引用prototype对象的属性和方法的。
用上图作为例子,来阐述下prototype与__proto__区别。
实例对象F1和F2 的构造函数是Foo,__proto__(隐式原型)指向(目的是获取它的属性和方法)构造函数Foo的prototype(原型对象),
Foo 的构造函数是Function,__proto__指向构造函数Function的prototype。
实例对象o1和o2的构造函数是Object,__proto__指向构造函数Object的prototype,Object的构造函数是Function,__proto__(隐式原型)指向构造函数Function的prototype。
当这个对象不再是谁构造出来时,此时的对象的prototype会通过__proto__指向Object的prototype,最终的Object的prototype的__proto__为null。
简单概括就是对象通过__proto__共享构造函数的prototype中的属性与方法。
网友评论