JavaScript 中的 __proto__ 和 prototype

当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)。

对象的__proto__指向自己构造函数的prototypeobj.__proto__.__proto__...的原型链由此产生,包括我们的操作符instanceof正是通过探测obj.__proto__.__proto__... === Constructor.prototype来验证obj是否是Constructor的实例。

原型链的尽头(root)是Object.prototype所有对象均从Object.prototype继承属性。

先有Object.prototype(原型链顶端),Function.prototype继承Object.prototype而产生,最后,FunctionObject和其它构造函数继承Function.prototype而产生。

prototype

每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。

prototype 作为一个对象是可以塞很多属性和方法的。

__proto__

每个对象都有一个隐式原型。每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。

因为函数也是一种对象,所以函数也有__proto__。

Object.__proto__ === Function.prototype