JS原型相关的__proto__和prototype颇有些相似,容易混淆,该如何理解并加以应用呢?
- __proto__针对对象,prototype针对函数/构造器;
- 所有构造函数/函数(包括Object)的__proto__都指向prototype,它是一个空函数;
- 内置对象的__proto__指向prototype;
- prototype.__proto__指向Object.prototype:Function.prototype.__proto__ === Object.prototype // true;
- 所有的构造器都是Object,继承了prototype的length、call、apply、bind,Object.prototype的toString、valueOf、hasOwnProperty等;
- prototype的__proto__指向null,即Object为基类对象:Object.prototype.__proto__ === null // true。
另外,参考实例对象的constructor属性,对于理解对象、原型、继承有一定的帮助。
结合实例,二者的关系可描述如下:
而对原型的理解,可用下图概括:
通过以上分析,可以对二者加以区别如下:
prototype是一个对象(函数)的原型对象,而__proto__则是对原型对象的引用。
另注:
通常不建议直接针对__proto__进行操作,代之以:Object.getPrototypeOf()和Object.setPrototypeOf()。
参考
草稿:2016.06.28,定稿:2016.07.11