关系如图:
看不懂?这里给个实例来具体分析一下。
//全局中有这么两个类
function Object () {}
function Function() {}
//
var obj1 = { }
//var Foo = new Function();
function Foo() {}
foo1 = new Foo();
在很多时候,构造函数称为类。
1. 普通对象的隐式原型对象__proto__指向Object函数的prototype是因为普通对象是通过new Object()创建出来的。
2. 每个函数都有一个显式原型对象prototype,同时函数也是一个对象,因此函数也有隐式原型对象__proto__。函数作为一个对象是通过new Function()创建出来的。就类似通过字面量的方式直接创建对象一样。当我们创建一个函数时,JS引擎会自动帮我们为函数添加一个对象,这个对象就是prototype,prototype里面有个constructor属性,属性值为函数对象。函数作为一个对象是通过new Function()创建出来的,所以函数的隐式原型为Function.proto。Function的prototype对象是在Function被创建出来时JS引擎自动为Function添加的,Function的prototype对象中有一个constructor属性,属性值为Function这个函数。函数的显式原型对象中的constructor值都指向自己的函数。
3. 原型对象作为对象是被全局函数Object创建出来的,全局函数Object作为函数也有自己显式原型对象prototype,因此原型对象的隐式原型对象__proto__指向全局函数Object的显式原型对象prototype。
4. 全局函数Object同时作为一个对象也有隐式原型对象__proto__, Object对象是由Function创建出来的,因此Object的隐式原型对象__proto__指向Function的显式原型对象Function.prototype。
5. 全局函数Function同时作为一个对象也有隐式原型对象__proto__,由于全局函数Function是由自己创建出来的,因此Function.__proto__指向Function。
结果
总结
了解三者关系的意义在于以后在遇到要输出对象中的属性和方法时,若产生一些奇怪的结果,可以从原理上进行分析。