由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 创建对象和构造类实现代码
Jul 30 Javascript
读jQuery之十 事件模块概述
Jun 27 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 Javascript
javascript中Object使用详解
Jan 26 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
js判断主流浏览器类型和版本号的简单实现代码
May 26 Javascript
JS实现JSON.stringify的实例代码讲解
Feb 07 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
Mar 08 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 Javascript
JavaScript获取当前url路径过程解析
Dec 27 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
Python读写文件基础知识点
2019/06/10 Python
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
Sony C++笔试题
2013/03/10 面试题
大学生个人自我鉴定
2013/12/03 职场文书
设计总监岗位职责
2013/12/07 职场文书
2014年党课学习材料
2014/05/11 职场文书
公司年会策划方案
2014/05/17 职场文书
合作经营协议书范本
2014/09/16 职场文书
出差报告范文
2014/11/06 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
HttpClient实现文件上传功能
2022/08/14 Java/Android