在js中不存在真正类,尽管ES6出了一个class关键词,但也只是个语法糖,用babel转成es5就能看到其实还是基于原型实现的。原型和原型链要说清楚需要涉及到很多东西,这里先上一张图:

这张图用MDN的话来解释就是:

JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为__proto__)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto) ,层层向上直到一个对象的原型对象为 null。

接下来说说__proto__和prototype的区别:

  1. __proto__是真正用来查找原型链去获取方法的对象。

  2. prototype是在用new创建对象时用来构建__proto__的对象

而加上函数和数组之后的原型链大概长这样:

最后根据规范,null 没有原型,并作为这个原型链中的最后一个环节。