深入理解Javascript的Object与Function的关系

一、Function()与Object()的关系图:

1、  Object的constructor指向Function

2、  Object的__proto__(firefox和chrome下存在,指向其父类的prototype)属性以及Function的__proto__属性和Function的prototype均指向同一个对象(firebug中显示为function(),chrome中显示为function Empty() {}),不管怎样,这三个指的是同一个对象。

3、  Function的prototype事实上也是Object的实例。因此prototype的__proto__指向Object的prototype。

4、  Object的prototype的__proto__属性为空,因此,虽然通过firebug可以看到Object.prototype为Object{ },但是通过Object.prototype instanceof Object返回为false。(个人觉得Object的prototype是整个js体系的源头)。


二、为什么Object instanceof Function为true,同时Function instanceof Object也为true?

首先得明白instanceof的原理,还是举例说明一下这个问题:

function A(){}

var a = new A();

大家应该都知道a instanceof A返回true,同时a instanceof Object返回也是true。其实其执行的过程是在a的整个原型链上去查找是否存在A.prototype,如果存在则返回true,否则返回false。

所以这样就比较好理解了,因为Object的原型链上存在Function.prototype(Object.__proto__===Function.prototype),所以Objectinstanceof Function返回true,同时Function.prototype.__proto__指向Object的prototype属性,自然返回的也是true。并且这也可以理解为什么Object.prototypeinstanceof Object返回为false了。

也正因为如此,在javascript中,所有的对象instanceof object均反回true。因为对象最终都通过new+构造函数生成(字面量产生对象的方式,实质上是等同于new Object())。而任何构造函数的产生本质上是通过new Function(…)产生。因此,不管通过new Object()还是通过其他构造函数产生的对象,在其原型链上一定能找到Object.prototype,所以必然都是Object的实例。


三、为什么这么设计?

个人觉得:

1、从函数的角度来说,函数在程序中的作用我想大家都知道,任何一门程序语言不可能没有函数的存在,所以Function是必须存在的。

2、从面向对象的角度来说,javascript中所有的东西都可以看做是对象,因此任何构造函数,包括Function和Object本身都是对象,因此,在javascript中也没有提到类的概念。

3、通过Function与Object的结合,构成了javascript强大而灵活的基于对象的函数式编程模式。



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值