原型链之论Object和Function的关系
- 每个函数都有一个prototype属性,它指向一个空对象,称原型对象(公共区域)!
- 每个函数的实例对象,都有一个__proto__属性,称隐式原型,实例对象隐式原型的值,为其对应函数显示原型的值。(所以原型链是通过隐式原型链去找自身没有的属性和方法)!
- 函数对象都是由Function函数生成的,而Function自身,本身也是函数,所以也由Function生成,则有Function.proto == Function.prototype //true (函数是自身的实例)
- Object也是构造函数,所以Object.proto == Function.prototype //对象是函数的实例
- js中规定,函数的原型,是Object的实例,则有:Function.prototype.proto == Object.prototype //true (函数原型对象是对象的实例)
- 而函数本身并非Object的实例,则Function.proto == Object.prototype //fasle
- 任何实例函数都可以访问到Object中的原型,而访问不到Funcion中的原型对象;eg:就函数F和它的实例对象f来说:
(1): f.proto == F.prototype //true
(2) F.prototype.proto == Object.prototype //true (函数对象,是Object的实例)
(3) F.proto == Function.prototype //true
(4) F.prototype__proto__ == Function.prototype //fasle
总结:1.通过隐式原型链,f.proto 到 F.prototype; 从 F.prototype.proto 到 Object.prototype,所以所以函数都可以访问到Object中的原型对象 ;
2.通过隐式原型链,f.proto 到 F.prototype;但 F.prototype.proto 不能到Function.prototype(只能是F.proto===Function.prototype),所以访问不到函数中的原型对象!
3.函数和对象互为实例的说法是错误的,因为Object.proto === Function.prototype 但Function.proto != Object.prototype,所以我认为只能说,对象是函数的实例,函数的原型对象是对象的实例!!
(注:以上仅为个人总结认为观点,可能有错误,如有请帮忙指出!)