js中call()和apply()改变指针问题的讲解


Posted in Javascript onJanuary 17, 2019

1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。(天生的)

2. 相同点:这两个方法的作用是一样的。

都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。

一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。

call有两个妙用:

  •           1: 继承。
  •           2: 修改函数运行时的this指针。

js中call()和apply()改变指针问题的讲解

js中call()和apply()改变指针问题的讲解

区别:call和apply的区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组或者arguments

<script>
  //一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。
  /*
  call方法:
  语法:call(thisObj,arg1,arg2,……,argN)
  定义:调用一个对象的一个方法,以另一个对象替换当前对象
  参数
    thisObj;可选项,将被用作当前对象的对象
    arg1,arg2,……,argN;可选项,将被传递方法参数序列
  说明
    call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变为有thisObj指定的新对象。
  
  如果没有提供thisObj参数,那么Global对象被用作thisObj
  */
  /*
  apply方法:
  语法:apply(thisObj,[arg1,arg2,……,argN])
  定义:应用某一个对象的一个方法,用另一个对象替换当前对象
  */
  //区别:call和apply的区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组或者arguments
  //1.
  function add(a,b) {
    console.log(a+b);
  }
  function sub(a,b) {
    console.log(a-b);
  }
  add.call(sub,3,1);//用add来替换sub,add.call(sub,3,1)==add(3,1),结果是console.log(4);
  //2.
  function Animal(){
    this.name="Animal";
    this.showName=function(){
      alert(this.name);
    }
  }
  function Cat(){
    this.name="Cat";
  }
  var animal=new Animal();
  var cat=new Cat();
  animal.showName.call(cat);
  // 通过call或者apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用。结果为alert("Cat");
  //3.
  function Animal(name){
    this.name=name;
    this.showName=function(){
    alert(this.name);
    }
  }
  function Cat(name){
    Animal.call(this,name);
  }
  var cat=new Cat("Black Cat");
  cat.showName();
  //Animal.call(this)的意思是使用Animal对象代替this对象,那么Cat中就有了Animal的所有方法和属性了,Cat对象就能直接调用Animal的方法和属性了。
  //4.
  function Class10(){
    this.showSub=function(a,b){
      alert(a-b);
    }
  }
  function Class11(){
    this.showAdd=function(a,b){
      alert(a+b);
    }
  }
  function Class2(){
    Class10.call(this);
    Class11.call(this);
  }
  //使用两个call就实现多继承了。
</script>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
document.write的几点使用心得
May 14 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
jquery使用经验小结
May 20 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
JavaScript fetch接口案例解析
Aug 30 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
微信小程序自定义toast组件的方法详解【含动画】
May 11 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 #Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 #Javascript
vue中$nextTick的用法讲解
Jan 17 #Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 #Javascript
js中Array对象的常用遍历方法详解
Jan 17 #Javascript
vuex如何重置所有state(可定制)
Jan 17 #Javascript
node app 打包工具pkg的具体使用
Jan 17 #Javascript
You might like
咖啡与水的关系
2021/03/03 冲泡冲煮
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
js资料prototype 属性
2007/03/13 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python调用C语言程序方法解析
2020/07/07 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
三个Unix的命令面试题
2015/04/12 面试题
班组长安全生产职责
2013/12/16 职场文书
新教师培训方案
2014/06/08 职场文书
教师考核鉴定意见
2015/06/05 职场文书
八年级作文之感恩
2019/11/22 职场文书
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
Python+Tkinter打造签名设计工具
2022/04/01 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python