原型链
任何对象都有__proto__属性,指向的是原型对象(propertype属性),原型对象也是对象,那也有__proto__属性,也就是说原型对象也有自己的原型对象。这样形成的链式结构,叫做原型链
注意:__proto__属性是浏览器的私有属性,存在兼容性问题,只建议本地开发的时候时候,线上如果要访问原型还是使用propertype.xxx去访问
1.构造函数访问原型
function Person(){} //构造函数
let person = new Person();
console.log(person.__proto__ === Person.prototype); //true
另外实例也可以通过__proto__访问到原型//[].__proto__
原型中的constructor属性
它是原型自带的属性
而这个属性指向的值就是构造函数,看下图
1)构造函数的原型链如下图
如果我们是构造函数,那么构造函数产生的实例对象->构造函数prototype >Object.property ->null
2)内置对象的原型链
内置对象Array的原型链
Let arr = new Array
arr -> Array.prototype ->Object.prototype->null
如下图
内置对象Date的原型链(和Array类似的)
date -> Date.prototype -> Object.prototype -> null
总结:那么我们总结原型链主要还是要学习它的属性查找原则
,
沿着原型链查找
1)首先我们在当前对象上查找是否有该属性,有就直接返回
2)如果没有就去对象原型上查找,如果有,就直接返回
3)如果还是没有找到就沿着原型链进行查找,知道Object.prototype位(Object.prototyp这相当于顶端位置了),有就返回
4)如果还是没有就返回undefined