理解Javascript_08_函数对象


Posted in Javascript onOctober 15, 2010

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

//定义方式一 
function func(x) { 
alert(x); 
} 
//定义方式二 
var func = function(x) { 
alert(x); 
}; 
//实际执行 
var 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]]处理逻辑一样。深层次的原因将在后续博文中介绍。

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

function Animal(){ 
} 
alert(Animal.length);//0 var dog = new Animal();

这个JS证明了步骤5的正确性。最后,还是来看一下函数对象的内存图,简单起见,内存图只描述了Animal的构造过程:
理解Javascript_08_函数对象
来自于一个整体的分析图:
理解Javascript_08_函数对象
图片本身已经能解释很多很多的问题了,结合前面instanceof原理,对象构造原理,原型链原理,自已去体会吧,我就不多说什么了。

其实上Function对象是一个很奇妙的对象,它与Object的关系更是扑朔迷离,我将在《理解Javascript_09_Function与Object》中解释这一切。

最后的声明:理论过于复杂,我不改保证其正确性。但经过多方的测试,还未发现理论与实际冲突的地方。

Javascript 相关文章推荐
改版了网上的一个js操作userdata
Apr 27 Javascript
分享27个jQuery 表单插件集合推荐
Apr 25 Javascript
将HTML格式的String转化为HTMLElement的实现方法
Aug 07 Javascript
JavaScript AOP编程实例
Jun 16 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 Javascript
详解使用React全家桶搭建一个后台管理系统
Nov 04 Javascript
javascript Function函数理解与实战
Dec 01 Javascript
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
vue分页器组件编写方法详解
Jun 28 Javascript
javascript instanceof 内部机制探析
Oct 15 #Javascript
理解Javascript_07_理解instanceof实现原理
Oct 15 #Javascript
JavaScript 对象模型 执行模型
Oct 15 #Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 #Javascript
JavaScript聚焦于第一个字段的代码
Oct 15 #Javascript
JavaScript访问样式表代码
Oct 15 #Javascript
IE下js调试工具Companion.JS
Oct 15 #Javascript
You might like
php中的登陆login实例代码
2016/06/20 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python3数字求和的实例
2019/02/19 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
HTML5 Web 存储详解
2016/09/16 HTML / CSS
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
干部下基层实施方案
2014/03/14 职场文书
优秀家长事迹材料
2014/05/17 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
乡镇团代会开幕词
2016/03/04 职场文书