宝哥软件园

理解Javascript_08_函数对象

编辑:宝哥软件园 来源:互联网 时间:2021-10-22

首先要定义一个概念:函数就是对象,代表函数的对象就是函数对象。既然是物体,是谁建造的?我们来看一段描述:JavaScript代码中定义的Functions,或者在调用Function创建函数时,函数fun : var new fun=fun(funargs,fun body)会以类似这样的形式被调用;可以看出,函数对象是由函数对象构造的。注意:Function对象本身也是一个函数,所以也是一个函数对象。要深入了解Function,请参考后续的博文。前面我们看一段代码:复制代码如下: //定义方法:func func(x){ alert(x);}//定义方法2 var func=function(x){ alert(x);};//实际执行varfunc=newfunction ("x "," alert(x);"。);从上面的代码可以看出,Function func无非是函数对象在接收到两个参数后构造的。注意:关于定义模式1和定义模式2的区别,请详细参考以下创建函数对象的步骤:1。创建一个内置对象fn 2。将fn的内部[[原型]]设置为Function.prototype 3。设置内部[[Call]]属性,这是一个内部实现的处理函数调用逻辑的方法。(简单理解为调用函数体)4。设置内部[[Construct]]属性,这是一个内部实现的方法,用于处理创建逻辑引用对象的过程。(简单理解为创建对象《理解Javascript_06_理解对象的创建过程》) 5。将fn.length设置为funArgs.length如果函数没有参数,则将fn.length设置为0。6.使用与新对象()相同的逻辑创建一个对象对象fnProto 7。将fnProto.constructor设置为fn 8。将fn . prototo设置为fnProto 9。return fn第1步和第6步的区别在于,第1步只是为实现对象对象创建一个内部数据结构(内置Object结构),并完成必要的内部初始化工作,但其[[Prototype]]、[[Call]]、[[Construct]]等属性应为null或内部初始化值。也就是说,我们可以理解为它不指向任何对象(对于像[[Prototype]]这样的属性)或者不包含任何处理(对于像[[Call]]和[[Construct]]这样的方法)。在步骤6中,将根据《理解Javascript_06_理解对象的创建过程》及其[[原型]]等创建一个新对象。将被设置。从上面的处理步骤中,我们可以知道,每当我们定义一个函数时,它的prototype就是一个Object实例,所以默认情况下,当我们创建一个自定义函数的实例对象时,它们的Prototype链会指向Object.prototype注意:function的一个特殊之处是它的[[Call]]和[[Construct]]处理逻辑是相同的。深层次的原因将在后续的博文中介绍。让我们编写一些用例脚本来测试上述理论:复制代码如下: function animal(){ } alert(animal。长度);//0 var dog=new Animal();这个JS证明了步骤5的正确性。最后,我们来看看函数对象的内存图。为了简单起见,记忆图只描述了Animal的构建过程:

整体分析图:

图片已经可以说明很多问题了。结合前面的实例原理、对象构造原理、原型链原理,自己实现。我不多说。实际上,函数对象是一个奇妙的对象,它与对象的关系更加复杂。我会在《理解Javascript_09_Function与Object》中解释这一切。最后声明:理论太复杂,为了保证正确性,我不会改动。然而,经过多次测试,理论和实践并不冲突。

更多资讯
游戏推荐
更多+