原型和原型链
一、几个概念
1、函数对象: js中,函数本身就是一个对象。
2、prototype (原型对象):当定义一个函数(函数对象)的时候,会包含一个预定义的属性,这个属性叫prototype。将这个属性称为 原型对象。
3、constructor (原型对象拥有 constructor预定义属性):原型对象prototype上都有预定义的constructor属性,用来引用它的函数对象。这是一种循环引用。
4、__proto__(隐式原型):js创建对象的时候(也就是new 构造函数的时候),产生的 实例对象身上都会有一个__proto__的内置属性,这个属性指向了 它的函数对象prototype。接着,函数对象的 原型对象也有__proto__, 指向 Object.prototype , 最终指向null, 因此不断的指向中,就形成了原型链。
5、new : 使用new调用构造函数 ,这个过程相当于执行了以下代码👇
var o = {} o.__proto__ = F.prototype; F.call(o)
因此,在原型链的实现上,new起了很关键的作用。
总结:
Js 规定,所有对象都有自己的原型对象(prototype)。
一方面,任何一个对象,都可以充当其他对象的原型;
另一方面,由于原型对象也是对象,所以它也有自己的原型。
因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……
那么,Object.prototype对象有没有它的原型呢?回答是Object.prototype的原型是null。
null没有任何属性和方法,也没有自己的原型。因此,原型链的尽头就是null。
二、 instance of
https://www.liaoxuefeng.com/wiki/1022910821149312/1023022043494624
https://juejin.im/post/5d713de26fb9a06ad3474c15