call和apply

obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。绑定后会立即执行函数。

唯一区别是apply接受的是数组参数,call接受的是连续参数。

function add(j, k){
return j+k;
} function sub(j, k){
return j-k;
}

我们在控制台运行:

add(5,3); //8
add.call(sub, 5, 3); //8
add.apply(sub, [5, 3]); //8 sub(5, 3); //2
sub.call(add, 5, 3); //2
sub.apply(add, [5, 3]); //2

调用原生对象的方法

示例:

var a = {0:1, 1:"yjc", length: 2}; 

a.slice(); //TypeError: a.slice is not a function

Array.prototype.slice.call(a);//[1, "yjc"]

对象a类似array,但不具备array的slice等方法。使用call绑定,这时候就可以调用slice方法。

实现继承

通过call和apply,我们可以实现对象继承。示例:

var Parent = function(){
this.name = "yjc";
this.age = 22;
} var child = {}; console.log(child);//Object {} ,空对象 Parent.call(child); console.log(child); //Object {name: "yjc", age: 22}

以上实现了对象的继承。

bind的使用

obj.bind(thisObj, arg1, arg2, ...);

把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后不会立即执行。

同样是add()和sub():

add.bind(sub, 5, 3); //不再返回8
add.bind(sub, 5, 3)(); //8

如果bind的第一个参数是null或者undefined,等于将this绑定到全局对象。

最新文章

  1. (二十三)原型模式详解(clone方法源码的简单剖析)
  2. [iOS UI设计笔记整理汇总]
  3. CentOS更改yum源与更新系统
  4. C#网络爬虫 WebUtility使用 转义字符 urlCode
  5. 5.linux内核模块基础,内核模块学习
  6. SVN中trunk、branches、tags用法详解
  7. [poj3046]Ant Counting(母函数)
  8. opengl基础学习专题 (二) 点直线和多边形
  9. 如何在Oracle网站获取官方免费课程
  10. centos6.2下安装星际译王stardict3.0
  11. [转]fatal error: iostream.h: No such file or directory
  12. 解决打包时IsCmdBld.exe出错的问题
  13. eclipse 配置 Tomcat 遇到的问题以及解决办法
  14. 使用sourceTree向码云提交代码时 push 错误 (或认证失败)解决办法
  15. Python之黏包的解决
  16. 网络爬虫BeautifulSoup库的使用
  17. Apache启动不成功时,用命令行检测(新手)
  18. Codechef SUMCUBE Sum of Cubes 组合、三元环计数
  19. 机器学习随笔01 - k近邻算法
  20. python字典按照value进行排序.bak

热门文章

  1. tomcat的CATALINA_HOME可以不用设置
  2. JavaScript-事件周期-点击替换颜色
  3. DWG2SHP DXF2SHP 如何把AutoCAD的DWG,DXF文件转换为Esri ArcGIS的Shape文件
  4. MySQL的安装配置
  5. Linux:-bash: ***: command not found,系统很多命令都用不了
  6. zmq学习笔记
  7. 词频统计web
  8. Java反射机制调用private类型的构造方法
  9. css+js回到顶部
  10. 精益VS六西格玛