方法调用是一个三元组<对象,方法名称,方法参数>
对象或者叫方法作用域:用于说明是哪个对象的方法,方法中this 指向哪个对象
方法名称
方法参数
方法调用方式
- 传统方法调用方式:
对象.方法(参数)
- javascript 反射的调用:
方法.apply.(对象,参数)
方法.call.(对象,参数)
- Java反射的调用
方法.invoke.(对象,参数)
apply方法使用例子:
案例一:下面为extjs源码和使用举例。方法.createCallback(参数)。对象默认为window
基于以下两个条件,extjs的createCallback为函数的反射调用做了一层封装,它用于创建某函数的回调函数,回调函数的参数是提前确定好的:
1.javascript编译器会将反射调用转化为传统方法的调用
2.函数也是对象,也可以有函数
// Function.prototype.createCallback表示任何方法都可以调用createCallback。
// arguments是调用这个方法时传进来的参数,例如”abc”
// method是调用者(this表示方法自己)例如t
// method.apply(window, args); 执行t方法,参数是传进来的”abc”,作用域为window
Function.prototype.createCallback = function(){
var args = arguments;
var method = this;
return function() {
return method.apply(window, args);
};
};
function t(a){
alert(a);
}
var x = t.createCallback("abc");
window.x();
案例二:将父对象的构造函数绑定在子对象上
function Cat(name,color){
Animal.apply(this, arguments);
this.name = name;
this.color = color;
}
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); // 动物
apply总结:
1.实现了构造函数的扩展,有点类似于JAVA,类的扩展。
2.实现了公共方法任何时间能被任何对象使用,相当于任何对象随时可以扩展方法。
参考文章
ExtJS createCallBack参考:
http://blog.csdn.net/wwwchenbing/article/details/3410266
ExtJS createDelegate源码解析:
http://yiminghe.iteye.com/blog/394170
ExtJS中创建回调createCallBack与createDelegate的异同(之十)
http://liust1987.iteye.com/blog/767302 这个博主还有其他文章也可以参考
Javascript面向对象编程(二):构造函数的继承
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html