关于原型和原型链,我们需要掌握这句话:
【实例化对象的原型链 指向 构造函数的原型】!!!
概念,prototype是原型的意思,__proto__代表原型链。
现在开始理解:~
1.生成一个构造函数Foo,a是Foo的实例化对象:
function Foo(){
console.log('我是构造函数Foo')
}
let a = new Foo()
那么a.__proto__ = Foo.prototype,对此可通过打印验证,它们果然是一样的:
2.Foo是一个构造函数,它的原型链__proto__ 指向谁呢,当然也指向它的构造函数的原型喽,那Foo是谁的实例化对象呢?需要知道,任何构造函数实质都是一个函数,因此,是函数的实例化对象。
也就是说Foo.__proto__ = Function.prototype,对此基于1中的Foo,可继续通过打印验证,它们果然是一样的:
ps:native code 的意思是它是程序自带的,是二进制编译的无法显示出来代码,这里代表已经追溯到js中的原生方法Function了。
3.那么回到1的结论里,a.__proto__ = Foo.prototype,那么 Foo.prototype的原型链__proto__指向哪里呢?那我们就要理解prototype是谁的实例化对象,就会指向谁的原型喽。
每个构造函数都会自带原型即prototype这个属性,这个属性的值是一个{},里面存储了它的属性和方法,也能看出来这是一个对象格式的数据。没错!你猜对了,prototype正是Object的实例,也就是说Foo.prototype.__proto__指向了Object.prototype,对此呢,我们也可以通过打印验证出来,它们果然是一样的:
So~以上三点,都体现了:实例化对象的原型链(__proto__)指向它的构造函数的原型(prototype)
因此,以后如果再迷茫,什么是原型?什么事原型链?谁指向谁?
我们只要想一下上面这句话,找一找谁(实例)是谁(构造函数)的是实例化对象,即这个实例是哪个构造函数生出来的崽?我们就可以推理出来喽。
ps:个人理解,仅此记录和分享,如有错误,敬请指正QWQ~