一.概念
当试图查找实例对象的某个属性时,不仅仅会在实例类上查找,还会在这个类的父亲爷爷祖爷爷,层层向上,直到查找到第一个名称相同的属性或者到达一个空的原型,这个就是javascript的原型链机制。其中每一层的原型所构成的这条查找链就是原型链。
三个类比: 资产=prototype ,隐式资产指针__proto__=父亲的资产 , 钱 = 属性/方法function
四句话:
- 查找原型链就是沿着指针__proto__ 找祖辈的要钱的过程
- 一个类的资产 = 自己的钱 + 隐式资产(父亲的资产)
换算:类.prototype = 自己所有方法(包含构造方法+其他方法)+ proto(父类的prototype) - new 出来的实例对象,想成未成年没有自己的prototype资产,只能沿着__proto__找隐式资产 = 类(父亲)的资产
换算: 实例对象.proto = 类.prototype - 万物起源于object,起源的隐式资产 为null空。
上面四句话翻译成js行话:
1.查找原型链就是找祖辈要属性/方法的过程
2.类.prototype = 自己所有方法(包含构造方法+其他方法)+ proto(父类的prototype)
3. 实例对象.proto = 类.prototype
4. 万物皆object的意思:所有的类的祖籍源头都是Object
二. 看代码
例子:Teacher 类 ==> 继承 Person 类 ==> 继承 Object 类 ==> null
class Person {
constructor(name) {
this.name = name;
}
drink(){
console.log(this.name,)
}
}
class Teacher extends Person{
constructor(name,sub) {
super(name)
this.sub = sub
}
drink(){
console.log(this.name,'教授课程:',this.sub)
}
}
let t = new Teacher("李老师","化学")
// new出来的实例 t 未成年,他只有隐资产__proto_ = 父亲Teacher的资产
console.log(t.__proto__=== Teacher.prototype)
console.log(t.__proto__.__proto__.__proto__.__proto__ === null)
// 怎么理解最后为null : 婴儿是t, Teacher类是父亲,Person类是爷爷,Object 祖爷爷
// 1. t.__proto__ ,婴儿t的隐式资产是父亲的资产,Teacher.prototype
// 2. (t.__proto__). __proto__ 父亲Teacher的隐式资产是爷爷的资产,Person.prototype
// 3. (t.__proto__. __proto__). __proto__ 爷爷Person的隐式资产是祖爷爷的资产,Object .prototype
// 4. (t.__proto__. __proto__. __proto__) .__proto__ 祖爷爷Object白手起家,没有隐式资产 为空null