理解下Js中prototype与__proto__

今天看了阮一峰老师的Javascript继承机制的设计思想,终于明白了,纠结了我一上午时间~~

谈到prototype与__proto__,首先理解它们出现的原因。

1、Js的历史

1994年,因为Navigator发布,在当时是第一个比较成熟的网络浏览器,可惜的是它不具备与用户交互的能力,这导致在用户使用频繁的功能上,如注册登录会浪费大量的时间与服务器资源。

此时网景公司急需一种可以与用户交互的语言,随后工程师Brebnda Eich便负责开发这种语言。起初他的想法是设计没必要复杂,能完成简单的操作就行了。

在设计中因为Javascript中都是对象,Brebnda Eich经过思考后决定采用了C++和Java中的new命令来生成对象,采用后新的问题出现了,构造函数生成的对象,无法共享属性和方法。

2、prototype属性的引入

prototype属性包含一个对象,所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面,实例对象一旦创建,自动(__proto__)引用prototype对象的属性和方法的。

理解下Js中prototype与__proto___第1张图片

用上图作为例子,来阐述下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中的属性与方法。

你可能感兴趣的:(理解下Js中prototype与__proto__)