function person() { this.name = '劝退师'; } person.prototype.age = 20; const p = new person();
运行发现
我们在自定义一个函数,函数包含两个关键数据 prototype,__proto__
1、原型 prototype:
person具有prototype属性:包含我们定义的属性name,age以及constructor,
并且constructor指向我们的person函数,可以理解为prototype就是我们原型对象,
下面我们会用到这句话。
2、原型链 __proto__
person 中的 __proto__
是一个原始的 function 对象,
在 function 对象中,又看到了 __proto__
这个属性,这时候它的值是原始的 Object 对象,
在 Object 对象中又再次发现了 __proto__
属性,这时候 __proto__
等于 null,
通过__proto__这个属性组成的链,就成为原型链。
3、两者的关系我们在实例化person的时候,new person()的时候通过prototype和__proto__进行关联绑定属性
可以看很清楚看得出 我们new 出来的实例p 的p.__proto__就是我们前面person函数的prototype,
实例p的原型链步骤就是 p.__proto__ => {constructor:func}.__proto__ => Object => null
实例对象步骤:
- 实现继承:如果没有原型链,每个对象就都是孤立的,对象间就没有关联,所以原型链就像一颗树干,从而可以实现面对对象中的继承
- 属性查找:首先在当前实例对象上查找,要是没找到,那么沿着
__proto__
往上查找 - 实例类型判断:判断这个实例是否属于某类对象