zoukankan      html  css  js  c++  java
  • call和apply的异同

    共同点:

    作用:调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

    以call为例,语法:obj1.method1.call(obj2,argument1,argument2)

    举一个具体的例子 
    function add(a,b) 

        alert(a+b); 

    function sub(a,b) 

        alert(a-b); 


    add.call(sub,3,1); 

    这个例子中的意思就是用 add来替换sub ,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。 


    看一个稍微复杂一点的例子 

    function Class1() 

        this.name = "class1"; 

        this.showNam = function() 
        { 
            alert(this.name); 
        } 


    function Class2() 

        this.name = "class2"; 


    var c1 = new Class1(); 
    var c2 = new Class2(); 

    c1.showNam.call(c2); 

    注意,call 的意思是把 c1 的方法放到c2上执行,原来c2是没有showNam() 方法,现在是把c1 的showNam()方法放到 c2 上来执行,所以this.name 应该是 class2,执行的结果就是 :alert("class2"); 

     继承

    function Class1() 

        this.showTxt = function(txt) 
        { 
            alert(txt); 
        } 


    function Class2() 

        Class1.call(this); 


    var c2 = new Class2(); 

    c2.showTxt("cc"); 

    这样 Class2 就继承Class1了,Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中不就有Class1 的所有属性和方法了吗,c2 对象就能够直接调用Class1 的方法以及属性了,执行结果就是:alert(“cc”); 

    不同点:

    call第二个参数为参数列表

    apply第二个参数为数组或者arguments对象

  • 相关阅读:
    POJ 2923 Relocation (状态压缩,01背包)
    HDU 2126 Buy the souvenirs (01背包,输出方案数)
    hdu 2639 Bone Collector II (01背包,求第k优解)
    UVA 562 Dividing coins (01背包)
    POJ 3437 Tree Grafting
    Light OJ 1095 Arrange the Numbers(容斥)
    BZOJ 1560 火星藏宝图(DP)
    POJ 3675 Telescope
    POJ 2986 A Triangle and a Circle
    BZOJ 1040 骑士
  • 原文地址:https://www.cnblogs.com/cumting/p/6715036.html
Copyright © 2011-2022 走看看