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;
Posted on 2013-04-09 13:49  SmileCN  阅读(210)  评论(0编辑  收藏  举报