• 关于call 与 apply 那些事


    1、定义:

    call : 调用一个对象的一个方法,以另一个对象替换当前的对象。

    apply : 应用某一对象的一个方法,用另一个对象替换当前的对象。

    2、用法:

    call:call(thisObj, arg1, arg2, ...);     说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj 。第二个参数开始,如  arg1...可以传递任意形式参数。

    apply : apply(thisObj, [argArray]);     说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj。 第二个参数开始,必须是array 或 arguments。

    3、区别:

    两者区别在于第二个参数。

    4、个人理解 :

    其实就是把前一对象的方法应用到后一对象上(括号中的第一个参数)。也就是改变了this指针的指向。

    5、啥也不说,上几个简单代码 :

     1             function func1(name){
     2                 this.name = name;
     3                 this.showName = function(){
     4                     console.log(this.name);
     5                 }
     6             }
     7 
     8             function func2(name){
     9                 this.name= name;
    10             }
    11 
    12             var obj1 = new func1("func1");
    13             var obj2 = new func2("func2");
    14             obj1.showName();
    15             obj2.showName(); //直接报错,因为obj2里没有 showName() 方法
    16             obj1.showName.call(obj2);  //这样就可以把 obj1 中的 showName() 方法给 obj2 用


    6、用来实现继承

     1             function func1(name){
     2                 this.name = name;
     3                 this.showName = function(){
     4                     console.log(this.name);
     5                 }
     6             }
     7 
     8             function func2(name){
     9                 func1.call(this,name);
    10             }
    11 
    12             var obj2 = new  func2("func2");
    13             obj2.showName();
     1             var Person = function(name,age){
     2                 this.name = name;
     3                 this.age = age;
     4                 this.gender = ['man','woman'];
     5             }
     6 
     7             var Stu = function(name,age,high){
     8                 Person.call(this,name,age);
     9                 this.high = high;
    10                 this.showMessage = function(){
    11                     console.log('name:'+this.name+", age:"+this.age+", high:"+this.high+", gender:"+this.gender[0]);
    12                 }
    13             }
    14              
    15             new Stu("zhangsan","20","178").showMessage();
     1             function Person(name,age){
     2                 this.name = name;
     3                 this.age = age;
     4                 this.sayHello = function(){
     5                     console.log(this.name);
     6                 }
     7             }
     8 
     9             function Print(){
    10                 this.funcName = "Print";
    11                 this.show = function(){
    12                     var msg = [];
    13                     for(var key in this){
    14                         if(typeof(this[key])!="function"){
    15                             msg.push([key,":",this[key]].join(""));
    16                         }
    17                     }
    18                     console.log(msg.join(" "));
    19                 }
    20             }
    21 
    22             function Student(name,age,grade,school){
    23                 Person.apply(this,arguments);
    24                 Print.apply(this,arguments);
    25                 this.grade = grade;
    26                 this.school = school;
    27             }
    28 
    29             var p1 = new Person("liang",80);
    30             p1.sayHello();
    31             var s1 = new Student("kobe",20,9,"aaaa");
    32             s1.show();
    33             s1.sayHello();
    34             console.log(s1.funcName);

    7,实践

    (1)找出数组中最大的元素,

    var arr = [5,3,8,1,0];

    Math.max(arr);   // 这样是不行的, 会提示 NaN

    所以需要遍历,如下:

    function getMax(arr){

      var arrlength = arr.length;

          var ret = 0;

      for(var i=0; i<arrlength; i++){

        ret = Math.max(ret, arr[i]);

      }

      return ret;

    }

    console.log(getMax(arr));   

    换用apply, 可以这样写

    function getMaxForApply(arr){

      return Math.max.apply(null, arr);

    }console.log(getMaxForApply(arr));

    两段代码达到了同样的目的,但是 getMaxForApply 却很优雅、简洁得多。

    (2)数组追加

    var arr1 = [1,2,3];

    var arr2 = [4,5,6];

    把 arr2 追加到 arr1 中。

    arr1.concat( arr2 ); // concat 方法并不改变 arr1 本身

    正常需要如下操作:

    function addarr(arr1,arr2){

      var arrlen = arr2.length;

      for(var i=0; i<arrlen; i++){

        arr1.push(arr2[i]);

      }

    }

    使用Apply ,代码就变得很简洁

    function addarr(arr1,arr2){

      Array.prototype.push.apply(arr1,arr2);

          return arr1;

    }

  • 相关阅读:
    hutool 导出excel 何苦
    PHP header 的7种用法 何苦
    JavaVolatile
    JVMjava内存区域
    JAVA内存泄露与溢出
    同步与互斥
    java线程池
    Java Synchronized
    docker 命令和使用
    leetcode(c++)(博弈类dp)
  • 原文地址:https://www.cnblogs.com/liangdaye/p/5407337.html
Copyright © 2020-2023  润新知