JS Call()与Apply()

ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。

例如:function add(a, b) { return a + b; }

function sub(a, b) { return a - b; }

/*apply用法

* var a1 = sub.apply(add, [4, 2]);

*var a2= add.apply(sub, [4, 2]);

*/

var a1 = sub.call(add, 4, 2);

var a2= add.call(sub, 4, 2);

输出:a1=2  a2=6

感觉还是有意未尽,更有意思的还在下面

js总是认为他是万能的,既然高级语言会继承,我js也不能示弱:JS模仿继承

function fun1() {

this.a = 123;

this.add = function () { return  this.a }

}

function fun2() {

this.a = 456;

}

var f1=new fun1()

var f2=new fun2()

var a = f1.add.call(f2);  // a输出的是456

这里就是把啊f1的方法拿给f2来使用,f2便可以使用f1中所有的方法,这不正是高级语言中继承的概念喽。当然根据综上可扩展出多继承,使用多个call便可以实现多继承

function fun1() {

this.add = function () { return this.a }

}

function fun2() {

this.sub = function () { return this.a-this.b }

}

function fun3() {

this.a = 10;

this.b = 2;

fun1.call(this);

fun2.call(this);

}

var f3 = new fun3()

alert(f3.add());

alert(f3.sub())

最新文章

  1. mybatis foreach的使用
  2. fonts.useso.com 访问变慢
  3. Servlet页面登录的数据库验证程序(二)
  4. linq查询结果datetime类型转string类型
  5. Nginx模块之————RTMP模块的FFmpeg的配置问题是FFmpeg的连续退出
  6. linux终端vi同时显示多个文件的分屏操作及切换操作
  7. oracle 常用语句
  8. 限制波尔兹曼机(Restricted Boltzmann Machines)
  9. Webservice简单概念
  10. Sliding Window
  11. ArrayList、LinkedList、HashMap底层实现
  12. 从Delphi 7升级到Delphi XE
  13. Keil的可重定位段
  14. bzoj 1040: [ZJOI2008]骑士 树形dp
  15. 关于查看文件size
  16. C++11 半同步半异步线程池的实现
  17. OpenStack(企业私有云)万里长征第五步——虚拟机Migrate&Resize
  18. iOS多线程开发之NSOperation - 快上车,没时间解释了!
  19. 【读书笔记】【深入理解ES6】#10-改进的数组功能
  20. centos7添加图像化桌面并设置中文

热门文章

  1. 1 初级.net web工程师,在工作中都做些什么
  2. session 共享
  3. POJ-1003&1004
  4. C++动态数组的实现
  5. poj 1159 Palindrome(区间dp)
  6. 嵌入式:nfs挂载开发板的几个陷阱
  7. 机器学习笔记(二)- from Andrew Ng的教学视频
  8. FFT算法
  9. VS 2013上Python的配置
  10. BZOJ 2599: [IOI2011]Race( 点分治 )