zoukankan      html  css  js  c++  java
  • js-call、apply

    这里主要就是做一些前人的总结,有时候会有自己的看法,首先把定义说一下

    1、方法定义

    call方法: 
    语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
    定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
    说明: 
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

    apply方法: 
    语法:apply([thisObj[,argArray]]) 
    定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
    说明: 
    如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
    如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

    2、相同点和不同点

      1)相同点:本质都是一样的,即两个方法都是实现一个目的,看环境用哪个方法更合适;

      他们的第一个参数可以直接理解成方法的上下文(继承也一样,后面说一下继承会提到),再说白一点,就是执行这个方法的时候,方法内部的this指向的就是第一个参数

      2)不同点:首先第二个可选参数的表现形式,call()第二参数是一个对象,可以有很多个;而apply第二个是一个数组,且最多只有一个。

      主要表现在不同场合,选择那个方法的问题。举例说明一下(都来自网络):

        a)参数比较灵活:alert(Math.max(5,7,9,3,1,6));   //9  

        用call没啥实质改变alert(Math.max.call(null,5,7,9,3,1,6));   //9

        用apply的话,可以把参数变成数组

        var arr = [5,7,9,3,1,6];

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

        因为arr作为参数的话,就活了,你可以在外界任意扩展长度,换做call的话,有多少得写多少参数。apply还可以用arguments,原因是arguments本身数组形        式展现(注意arguments是类似数组的,但本质不是数组,只是有数组的性质:arg[n],arg.length等)

        b)apply根据第二个参数是数据组的特点,可以做一些数组方面的应用:

        数组push:

        var arr1=[1,3,4];  
           var arr2=[3,4,5];  
           如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]   
           arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]  

        笨方法就是循环添加,这里可以用Array.prototype.push.apply(arr1,arr2);

        也可以用concat方法

        数组concat降低纬度:

        var arr = ['a','b',['c','d'],'e'];

        想变成一维的,这时候可以用var rtn_arr = arr.concat.apply([],arr);//变成了 ['a','b','c','d','e'];

    3、继承

     function  Person(name,age,love){  
            this.name=name;  
            this.age=age;  
            this.love=love;  
            this.say=function say(){  
                alert("姓名:"+name);  
            }  
        }  

        //call方式  
        function student(name,age){  
            Person.call(this,name,age);  
        }  

        //apply方式  
        function teacher(name,love){  
            Person.apply(this,[name,love]);  
            //Person.apply(this,arguments); //跟上句一样的效果,arguments  
        }  

       obj.call(this)这种没有方法的直接调用call的写法称之为继承,但本质上还是没脱离定义的,这里的obj实际上代表这构造方法,以上面例子说明:

      Person.call(this,name,age),Person代表的就是Person()这个函数的构造方法,实际上就是window.Person.call(this,name,age),window对象调用Person()方法,然后上下文(所谓的this)指向sudent,     这个时候Person()构造方法里this实际上就是student,这也就是为什么student会有了Person的属性(所谓的继承)。

      同时也能得出,这种继承,是得不到原型赋值的属性的,即Person通过prototype赋值的属性,是无法用这个方法传递的

  • 相关阅读:
    Linux:mv命令
    Linux:cp -rp
    Linux:sed命令
    Linux:cut命令...未完待续
    Linux:xargs命令
    python动态获取对象的属性和方法 (转载)
    python 继承中的super
    HTTP认证机制(翻译)
    技术名词解释
    设计模式之代理模式
  • 原文地址:https://www.cnblogs.com/aishangyizhihu/p/4216317.html
Copyright © 2011-2022 走看看