本质是沿着隐式原型向上找的。
访问一个对象的属性时,
- 先在自身属性中查找,找到返回
- 如果没有, 再沿着[ proto ]这条链向上查找, 找到返回
- 如果最终没找到, 返回undefined
![N(4)PEY0ADK1_2_6NV~R44.png
- 作用: 查找对象的属性(方法)
互为构造函数和实例对象的,共有一块内存的空间(object); 其中Foo()是Function()互为—,Object()是Funciton()互为,所以这两对共用一块内存空间。
快速判断的方法:互为实例对象构造函数的两个,必指向同一块内存空间。按照这个思路思考会更快。
关于这个图怎么记忆并运用:按列来看,实例对象都在第一列,对应的构造函数都在第二列(Object、Function也是所有函数和对象的构造函数,属于老祖宗级别),第二列三个构造函数的相应的原型对象都平行其位置放置在第三列。
再记住几点:f是F的实例对象,所以隐式原型链f—>F.prototype。而F不过是个平时用的声明的普通函数,也是老祖宗Function的实例对象,所以隐式原型链F—>Funciton.prototype。 又,F.prototype是一个空的object对象,自然由老祖宗Object创建,故F.prototype—>Object.prototype。另外,第一列的实例对象中的object是由Object创建的实例对象,所以object—>Object.prototype。注意,此时这一条和上一条隐式原型链形成了交汇,交汇到Object.prototype。而,Object虽然是老祖宗,但它仍然由Function创造,也就是其实例对象,所以有Object—>Function.prototype,此时又与F—>Funciton.prototype形成了交汇,位于第三列第三个圈。而这个圈也是个空object,是Object的实例对象,所以有Function.prototype—>Object.prototype。此时三条隐式原型链形成了交汇,交汇圈是Object.ptototype,而它也是个object空对象,但是它的—>(即proto)为null,就是说往上没有了,隐式原型链就此到头。
下图是自己画的图,快速有效,方便理解:
下图是网友提供,据说更为全面,但我不习惯看这个,更接受第一张图: