zoukankan      html  css  js  c++  java
  • 要理解javascript中间apply和call

    apply和call它是javascript一个非常重要的方法,。虽然与程序平时很少接触,但JS到处都在使用这个框架2方法。

    2个方法是在Function.prototype中。也就是说每一个JS函数都有这2个方法。

    alert(Function.prototype.hasOwnProperty("apply"));//true
    alert(Object.prototype.hasOwnProperty("apply"));//false


    这2个函数完毕的功能是等价的。唯一的区别在于參数形式不同。

    function Person(name,age)
    {		
        alert("name=" + name +",age="+age);
    }
    	
    Person.call({},"aty",10);
    Person.apply({},["aty",10]);


    方法的具体介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function


    java中通过反射调用方法的代码例如以下:

    Method method = clazz.getDeclaredMethod("say");
    method.invoke(clazz.newInstance(),null);

    能够看到:java反射方法调用与apply/call是非常相似的。Person相当于method,代表着调用什么方法。{}和clazz.newInstance()相似,代表调用哪个对象(即方法中的this),最后面是方法须要的參数列表。

     

    我们知道在java中thiskeyword代表当前对象,我们无法改动。javascript中直接调用函数,跟java函数调用一样,this就代表当前对象。

    假设想改动this。那么能够使用apply这样的方式。

    aobj.afunction("1");

    aobj.afunction.apply(bobj,["1"]);

    第一种方式,函数中的this就是aobj,这是我们比較熟悉的做法;另外一种方式。函数中的this是bobj。

    通过apply。对象bobj能够使用aobj中定义的方法。

    function FunctionA(name)  
    {  
        this.name=name;  
    }  
    
    function FunctionB(name,age)  
    {  
        
        FunctionA.apply(this,arguments);  
        this.age=age;  
    }  
    
    var bObj = new FunctionB("qq",11); 

    使用F12调试工具能够发现:bObj对象中有name和age属性。


     

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    吃一堑长一智
    人做事 天看着
    【转贴】英语中12个月名称的由来
    4199,流氓中的流氓
    【转贴】看D片容易误解的10个词组
    【转载】中国小吃(英文表达)
    拼死拼活为了啥!
    GCII 1.4对1.31改进
    上古III的汉化和美化修正
    linux下tar的用法
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4851893.html
Copyright © 2011-2022 走看看