理解Javascript_08_函数对象

如果你无法理解博文在讲什么,请回顾前面的系列博文。文章比较深入,如有不对之处,望请指正,谢谢。

  函数对象

  首先,大家得明确一个概念:函数就是对象,代表函数的对象就是函数对象。既然是对象,那它又是被谁构造出来的呢?下面我们来看一段描述:JavaScript代码中定义函数,或者调用Function创建函数时,最终都会以类似这样的形式调用Function函数:var newFun=Function(funArgs, funBody); 。由此可知函数对象是由Function这个函数对象构造出来的。

注:Function对象本身也是一个函数,因此它也一个函数对象。关于Function的深入理解,请见后续博文。

  我们来看一段代码:

01//定义方式一
02function func(x) {
03    alert(x);
04}
05//定义方式二
06var func = function(x) {
07    alert(x);
08};
09//实际执行
10var func = new Function(“x”, “alert(x);”);

  通过上面的代码可知,函数func无非是由Function对象接收两个参数后构造出来的而矣!

  注:关于定义方式一与定义方式二的区别,请见后续博文

  函数对象的创建过程

  函数对象详细创建步骤如下:

  1. 创建一个build-in object对象fn

  2. 将fn的内部[[Prototype]]设为Function.prototype
  3. 设置内部的[[Call]]属性,它是内部实现的一个方法,处理函数调用的逻辑。(简单的理解为调用函数体)

  4. 设置内部的[[Construct]]属性,它是内部实现的一个方法,处理逻辑参考对象创建过程。(简单的理解为创建对象《理解Javascript_06_理解对象的创建过程》一文)

  5. 设置fn.length为funArgs.length,如果函数没有参数,则将fn.length设置为0
  6. 使用new Object()同样的逻辑创建一个Object对象fnProto
  7. 将fnProto.constructor设为fn
  8. 将fn.prototype设为fnProto
  9. 返回fn

  步骤1跟步骤6的区别为,步骤1只是创建内部用来实现Object对象的数据结构(build-in object structure),并完成内部必要的初始化工作,但它的[[Prototype]]、[[Call]]、[[Construct]]等属性应当为 null或者内部初始化值,即我们可以理解为不指向任何对象(对[[Prototype]]这样的属性而言),或者不包含任何处理(对 [[Call]]、[[Construct]]这样的方法而言)。步骤6则将按照《理解Javascript_06_理解对象的创建过程》创建一个新的对象,它的 [[Prototype]]等被设置了。

  从上面的处理步骤可以了解,任何时候我们定义一个函数,它的prototype是一个Object实例,这样默认情况下我们创建自定义函数的实例对象时,它们的Prototype链将指向Object.prototype。

  注:Function一个特殊的地方,是它的[[Call]]和[[Construct]]处理逻辑一样。深层次的原因将在后续博文中介绍。

  下面我们写一些用例脚本来测试一下上面的理论:

1function Animal(){
2}
3alert(Animal.length);//0
4var dog = new Animal();
1function Person(name,age){
2}
3alert(Person.length);//2

  这个JS证明了步骤5的正确性。最后,还是来看一下函数对象的内存图,简单起见,内存图只描述了Animal的构造过程:

  来自于一个整体的分析图:

  图片本身已经能解释很多很多的问题了,结合前面instanceof原理,对象构造原理,原型链原理,自已去体会吧,我就不多说什么了。其实上Function对象是一个很奇妙的对象,它与Object的关系更是扑朔迷离,我将在《理解Javascript_09_Function与Object》中解释这一切。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值