JS原型相关的__proto__和prototype颇有些相似,容易混淆,该如何理解并加以应用呢?

  1. __proto__针对对象,prototype针对函数/构造器;
  2. 所有构造函数/函数(包括Object)的__proto__都指向prototype,它是一个空函数;
  3. 内置对象的__proto__指向prototype;
  4. prototype.__proto__指向Object.prototype:Function.prototype.__proto__ === Object.prototype // true;
  5. 所有的构造器都是Object,继承了prototype的length、call、apply、bind,Object.prototype的toString、valueOf、hasOwnProperty等;
  6. prototype的__proto__指向null,即Object为基类对象:Object.prototype.__proto__ === null  // true。

另外,参考实例对象的constructor属性,对于理解对象、原型、继承有一定的帮助。

结合实例,二者的关系可描述如下:

__proto__和prototype

而对原型的理解,可用下图概括:

JS原型链

通过以上分析,可以对二者加以区别如下:

prototype是一个对象(函数)的原型对象,而__proto__则是对原型对象的引用。

另注:

通常不建议直接针对__proto__进行操作,代之以:Object.getPrototypeOf()和Object.setPrototypeOf()。

 

参考

  1. JavaScript中__proto__与prototype的关系
  2. 谈谈__proto__和prototype的区别

草稿:2016.06.28,定稿:2016.07.11