由JavaScript中call()方法引发的对面向对象继承机制call的思考


Posted in Javascript onSeptember 12, 2011

起因:

今天在阅读snandy大神的读jQuery之五(取DOM元素)时,看到有讲到toArray()方法,具体jQuery代码如下:

toArray: function() { 
return slice.call( this, 0 ); 
}, 
get: function( num ) { 
return num == null ? 
// Return a 'clean' array 
this.toArray() : 
// Return just the object 
( num < 0 ? this[ this.length + num ] : this[ num ] ); 
},

看到这里的call()方法,以前也看过手册,说是对象冒充的,用于继承的。在jQuery源码里有点乱,所以就把这部分提取出来,放在一个单独文件中,来看看具体执行。

但还是没太明白,今天决定研究下call。于是查了下MDN上的说明,心血来潮,拿出我的“葵花宝典”-牛津大辞典,准备练习下自己的英文水平,提高提高,而且也提供给有需要的朋友一些帮助(翻译中如果有些出路,请各位前辈见谅!)
call

摘要:

 通过给定的this和arguments来调用一个function

 注意:该方法与apply方法语法相似,但不同的是:call()接受参数列,而apply()接受传递给函数的参数数组

 Function类的一个方法:版本JavaScript 1.3版以后

语法:

 fun.call(thisArg[, arg1[, arg2[, ...]]])

参数说明:

 thisArg:

为fun()的调用指定对象。注意:你看到的this值可能不是实际的值:如果这个方法是在 non-strict mode下,null和undefined会被全局对象替换掉,原始的值会被封装。

 arg1,arg2,....

this对象的参数

描述:

当调用一个已存在的函数,你可以分配不同的对象。这时,this指定的对象是当前正在调用对象。

通过call,你可以只写一次方法,而被另一个对象来继承。而不用自己再新建对象时,重写该方法。(即对象冒充,下面会有例子说明!)

在MDN官网上面有例子可以看看。另外,无意中在stackoverflow上看到了篇相关的问题,看到里面的一个回答,一下子就明白了对象冒充,怎么冒充了。
下面把那部分摘取出来(点击这里看原文):

In javascript, methods of an object can be bound to another object at runtime. In short, javascript allows an object to "borrow" the method of another object:

object1 = { 
name:'frank', 
greet:function(){ 
alert('hello '+this.name) 
} 
}; 
object2 = { 
name:'andy' 
}; 
// Note that object2 has no greet method. 
// But we may "borrow" from object1: 
object1.greet.call(object2);

The call and apply methods of function objects (in javascript functions are objects as well) allows you to do this. So in your code you could say that the Nodelist is borrowing an array's slice method. What does the conversion is the fact that slice returns another array as it's result.

这里的第一句话说的很形象,大致意思就是:在JavaScript中,对象的方法可绑定到另外一个对象上。简单点说,就是,JavaScript中允许对象‘借用'本不属于它本身的方法。“冒充”也就不言而喻了,就上上面的例子来说,object2冒充object1,来调用object1的方法。

PS:菜鸟第一次写博客,有点乱,我相信以后会慢慢改善,向各位师兄师姐学习怎么写博客,写好博客。另外欢迎大家给我批评与指导!

参考资料:
1.w3cschool ECMAScript 继承机制实现

2.MDN上call的说明

3.stackoverflow

Javascript 相关文章推荐
Javascript 不能释放内存.
Sep 07 Javascript
JS 拼图游戏 面向对象,注释完整。
Jun 18 Javascript
ExtJS 工具栏 分页事件参数
Mar 05 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
Apr 08 Javascript
javascript full screen 全屏显示页面元素的方法
Sep 27 Javascript
jquery手风琴特效插件
Feb 04 Javascript
JavaScript多线程详解
Aug 12 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
May 05 Javascript
微信小程序新增的拖动组件movable-view使用教程
May 20 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 Javascript
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
腾讯UED 漂亮的提示信息效果代码
Sep 12 #Javascript
jQuery的.live()和.die() 使用介绍
Sep 10 #Javascript
jquery tab插件精简版分享
Sep 10 #Javascript
javascript语言结构小记(一)
Sep 10 #Javascript
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
Sep 10 #Javascript
JavaScript高级程序设计 事件学习笔记
Sep 10 #Javascript
You might like
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
详解php协程知识点
2018/09/21 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
jquery插件开发注意事项小结
2013/06/04 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
js转换对象为xml
2017/02/17 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python中的字典详细介绍
2014/09/18 Python
浅谈python中set使用
2016/06/30 Python
pandas数据集的端到端处理
2019/02/18 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
元旦活动感言
2014/03/08 职场文书
保险公司演讲稿
2014/09/02 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
python通配符之glob模块的使用详解
2021/04/24 Python
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server