Object和Function的关系其实属于原型链的知识范畴,若是对于原型链、原型继承还不熟悉的话,能够戳这边o( ̄▽ ̄)o浏览器
Object、Function和其它对象的关系能够概括为下面四点:函数
是否是感受有点绕,下面我会逐点解释(下面的"一切对象"指除null的其它一切对象):post
下面两点能够佐证:prototype
1)一切对象的原型链最终都是.... → Object.prototype → null
。例如定义一个num变量var num = 1
,则num的原型链为x → Number.prototype → Object.prototype → null
; 定义一个函数对象fnfunction fn() {}
,则fn的原型链为fn → Function.prototype → Object.prototype → null
;等等...code
2)一切对象都包含有Object的原型方法,Object的原型方法包括了toString、valueOf、hasOwnProperty等等,在js中无论是普通对象,仍是函数对象都拥有这些方法,下面列出了几个例子,你们能够自行去举例验证:cdn
函数对象包括了Function、Object、Array、String、Number,还有正则对象RegExp、Date对象等等,它们在js中的构造源码都是function xxx() {[native code]);
,Function其实不只让咱们用于构造函数,它也充当了函数对象的构造器,甚至它也是本身的构造器。对象
从原型链能够佐证:blog
对象.__proto__ === 构造器.prototype
,由此能够见得它们之间的关系。
疑:Object对象都继承自Function对象了,而一切对象又都继承自Object对象,这边是否是有矛盾,Object对象和Function对象的关系是否是有点♂复♀杂?继承
答:其实疑问的内容就是上面结论的三四点,它们没有矛盾,关系也不复杂。原型链
.... → Object.prototype → null
,包括Function对象,只是Function的原型链稍微绕了一点,Function的原型链为Function → Function.prototype → Object.prototype → null
,它与其它对象的特别之处就在于它的构造器为本身,即直接继承了本身,最终继承于Object,上面的原型链能够在浏览器验证:Object → Function.prototype → Object.prototype → null
,原型链又绕回来了,而且跟第一点没有冲突。能够说Object和Function是互相继承的关系。
1)一切对象继承自Object,Object又继承自Function,那一切对象是否是都有Function的原型方法?
答:不对,普通对象都没有Function的原型方法。从咱们所写原型链中能够看出,Object是继承自Function,而Object也有Function的原型方法(好比bind),但Object继承获得的方法储存于__proto__
属性中,普通对象从Object继承到的原型方法却在于prototype
属性中,于是不对。
2)Function对象怎么那么怪,本身继承本身?
答:就是 就是。
Object对象直接继承自Function对象,一切对象(包括Function对象)直接继承或最终继承自Object对象。
(有说得不够清楚或者错误的地方,欢迎拍砖~)