理解原型链必须三句话
1、所有的函数数据类型都天生自带一个属性:prototype(原型),这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存
2、在浏览器给prototype开辟的堆内存中有一个天生自带的属性:constructor,这个属性存储的值是当前函数本身
3、每一个对象都有一个——proto——的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是object的实例)
Array.prototype.constructor===Array【true】
每个类都把供实例调取的公共属性方法存储到自己的原型上 (原型prototype的作用就是存储一些公共的属性和方法,供它的实例调取使用)
基本object的原型上的__proto__指向null,因为到最底层类,如果要指向也是指向自己本身,没意义
f1.name=xxx =>给自己设置私有属性
f1.__proto__.name=xxx =>给原型上设=设置公有属性
(每个实例都可以用这个属性)
原型链机制:
它是一种基于__proto__向上查找的机制,当我们操作实例的某个属性或者方法的时候,首先找自己空间中私有的属性或者方法
1、找到了,则结束查找,使用自己私有的即可
2、没有找到,则基于__proto__找所属类的prototype,如果找到就用这个共有的,如果没有找到,基于原型上的__proto__继续向上查找,一直找到object.prototype的原型为止,如果在没有,操作的属性或者方法不存在