由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的时候写的学习笔记
Dec 30 Javascript
javascript中获取下个月一号,是星期几
Jun 01 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
JavaScript中获取纯正的undefined的方法
Mar 06 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
JavaScript中双向数据绑定详解
May 03 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
JS抛物线动画实例制作
Feb 24 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 Javascript
腾讯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生成自己的LOG文件
2006/10/09 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
jquery 选择器部分整理
2009/10/28 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
javascript折半查找详解
2015/01/26 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
js变量提升深入理解
2016/09/16 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python生成器的使用方法
2013/11/21 Python
Python中关于使用模块的基础知识
2015/05/24 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
详解python:time模块用法
2019/03/25 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
html Table 表头固定的实现
2019/01/22 HTML / CSS
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
大专生自我鉴定范文
2013/10/01 职场文书
《雾凇》教学反思
2014/02/17 职场文书
春节联欢会策划方案
2014/05/16 职场文书
2014年个人委托书范本
2014/10/13 职场文书
培训师岗位职责
2015/02/14 职场文书
2015年助残日活动总结
2015/03/27 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript