1.call:
应用于:Function对象;
调用一个对象的一个方法,以另一个对象替换当前对象;
call(thisObj[,arg1[,arg2[,arg3,[argN]]]]);
参数:
thisObj:将被用作当前对象的对象;
arg1...argN:将被传递方法参数序列;
说明:
call方法可以用来代替另一个对象调用一个方法;
call方法可以讲一个函数的对象上下文从初始的上下文改变成thisObj指定的新对象;
ex:
obj1.method.call(obj2,arg1,arg2);
call的作用就是把obj1的方法放到obj2上去使用,而arg1,arg2可以当作参数传入;
举一个具体的例子:
function add(a,b){ alert(a+b); } function sub(a,b){ alert(a-b); } add.call(sub,2,3); //5
//这个例子就是用add代替sub == add(2,3);
举一个复杂点的例子:
function class1(){ this.name="class1"; this.showName=function(){ alert(this.name); } } function class2(){ this.name="class2"; } var c1=new class1(); var c2=new class2(); c1.showName.call(c2); //class2
//这个例子中把c1的showName方法放到c2上来执行,结果自然是class2;
用call方法来实现继承:
function person(){ this.showAge=function(num){ alert('我今年'+num+'岁'); }; }; function person2(){ person.call(this); } var p2=new person2(); p2.showAge(20); //我今年20岁;
//person.call(this); 的意思是用this也就是person来代替person2,这样person2就拥有了person的所有方法;
实现多重继承:
function person(){ this.showAge=function(num){ alert('我今年'+num+'岁'); }; }; function person2(){ this.showName=function(name){ alert('我叫'+name); }; }; function person3(){ person.call(this); person2.call(this); }; var p3=new person3(); p3.showAge(21); //我今年21岁; p3.showName('smile'); //我叫smile;
//很简单,使用2个call就实现了多重继承;
2.apply:
和call用法基本相同,只是第二参数必须是数组也可以是arguments;
obj1.apply(thisObj,[arg1,arg2...argN]);
obj1.apply(thisObj,arguments);
3.caller:
返回一个对函数的引用,该函数调用了当前函数;
functionName.caller
对于函数来说,caller属性只有在函数执行时才有定义.
如果函数是由顶层调用的那么caller包含的就是null;
如果在字符串上下文中使用了caller属性,那么和functionName.toString一样,也就是说,显示的是函数的反编译文本;
ex:
function callerDemo(){ if(callerDemo.caller){ var a=callerDemo.caller.toString(); alert(a); }else{ alert("this is a top function"); } }; function handleCaller(){ callerDemo(); } callerDemo(); //this is a top function; handleCaller(); //function handleCaller(){ callerDemo(); }
4.callee:
返回正被执行的 Function 对象,也就是指定的Function对象的正文;
[function.]arguments.callee;
可选项:function参数是当前正在执行的 Function 对象的名称;
说明:
callee的初始值就是正被执行的function对象;
callee属性是arguments对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归,或者是保证函数的封装性;
//arguments.length是实参的长度; //arguments.callee.length是形参的长度;
//由此可以判断形参和实参的长度是否一致;
ex:
function calleeDemo(){ alert(arguments.callee); } //可以打印其自身; // function calleeDemo(){ // alert(arguments.callee); // }
验证形参和实参的长度是否一致;
function calleeLengthDemo(arg1,arg2){ if(arguments.length==arguments.callee.length){ alert('形参和实参长度一致!'); }else{ alert('形参长度为:'+arguments.callee.length); alert('实参长度为:'+arguments.length); } }
递归函数:
var sum=function(n){ if(n<=0){ return 1; }else{ return n+arguments.callee(n-1); } }; sum(2) //4; sum(3) //7;