要理解javascript中间apply和call
2015-10-02 08:33
239 查看
apply和call它是javascript一个非常重要的方法,。虽然与程序平时很少接触,但JS到处都在使用这个框架2方法。
2个方法是在Function.prototype中。也就是说每一个JS函数都有这2个方法。
这2个函数完毕的功能是等价的。唯一的区别在于參数形式不同。
方法的具体介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function
java中通过反射调用方法的代码例如以下:
能够看到: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中定义的方法。
使用F12调试工具能够发现:bObj对象中有name和age属性。
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属性。
相关文章推荐
- cocos2d-x 3.1.1 学习笔记[17] 关于这些活动功能
- Django操作model时刻,一个错误:AttributeError:’ProgrammingError’ object has no attribute ‘__traceback__’
- 转载android 规范技巧
- android通讯录开发及优化
- Android Api Demos登顶之路(八十六)Graphics-->Regions
- Android Api Demos登顶之路(八十五)Graphics-->PurgeableBitmap
- 微信商城中使用微信支付接口获取用户地址
- Android进程和线程
- 【转】中间件的历史来看移动App开发的未来
- Android官方教程中文版
- swift详解之二十九------谈谈debug的一些高级用法lldb
- 自定义对话框
- Android 简单计算器的实现
- Ubuntu12.04 64bit 下载android4.3源代码
- Object-C学习笔记之基础知识一
- Android环境搭建中遇到的小问题
- Hibernate 5.0.2加载hibernate.cfg.xml时mapping不生效
- Object-C学习笔记之基础知识一
- 如何将android studio设置复位,将设置恢复到初始化
- appium 相关内容