• Javascript中关于call()和apply()方法的this指向问题


    概念:

    1.call 方法可以用来代替另一个对象调用一个方法,改变函数内部的this指向。

    2.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。简单讲就是借用上下文环境

    3.apply()和call()异曲同工,

    使用:

    1.第一个参数是一个对象,第二个参数是数组里面所有的参数

    2.apply()第一个参数也是一个对象,第二个参数是一个数组

    实例a:

    1 var number = [-15,-1,0,17,59,108];
    2     var maxInNumber = Math.max.call(Math,-15,-1,0,17,59,108);
    3     var maxInNumber = Math.max.apply(Math,number);
    4     var maxNumber = Math.max(-1,12,59);
    5     console.log(maxNumber);          //59
    6     console.log(maxInNumber);        //108

    这个例子的maxInNumber的this指向的方法变成了Math.max()这个方法本身,所以第六行输出了108

     实例b:

    1 function add(a,b){
    2          this(a,b);         
    3             console.log(a+b);    //2
    4          };
    5          function sub(a,b){
    6             console.log(a-b);    //4
    7          };
    8          add.call(sub,3,1);     

     这个实例 首先 add.call(sub,3,1)执行的是 add方法, 然后,add执行的时候, this已经变成了 sub这个方法本身,所有this(a,b)这一句输出了2

    实例c:

     1 function Movie(){
     2          this.name = "Movie";
     3          this.showName = function(){
     4               console.log(this.name);
     5          }
     6 }
     7 function Book(){
     8          this.name = "Book";
     9 }
    10  var movie = new Movie();
    11 var book = new Book();
    12             
    13   /**通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用**/
    14   movie.showName.call(book,"");          // Book      第二个参数所有的参数
    15    movie.showName.apply(book,[]);            // Book      第二个参数是一个数组

    这个实例通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用

    实例d:

     1 function Movie(name){
     2          this.name = name;
     3          this.showName = function(){
     4               console.log(this.name);
     5          }
     6 }
     7 function Book(name){
     8          Movie.apply(this,[name]);   
     9       // Movie.call(this,name);   10 }
    11 var book = new Book("Javascript");    //book对象可以调用Movie对象上的方法和属性
    12 book.showName();        //Javascript

    关于继承:使用Movie对象代替this对象,那么Book对象也就有了Movie的属性和方法

  • 相关阅读:
    【转】设计模式总结
    【转】并行开发
    C#开发微信公众平台-就这么简单
    (转载)MVC,MVP 和 MVVM 的图示
    插入排序
    选择排序
    VS发布 错误 未能将文件 复制到
    SqlServer 更改数据库名称
    linq查询时查询语句中附带多个查询时“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”
    不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)
  • 原文地址:https://www.cnblogs.com/zpzl/p/6690451.html
Copyright © 2020-2023  润新知