欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-23 23:57:22
1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。(天生的) 2. 相同点:这两个方法的作用是一样的。 都是在特定的作用域中调用函数,等于...

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>

总结

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