日期:2014-05-16 浏览次数:20416 次
? 看到别人在讨论js的call,忍不住记下一笔,call的意思是改变被调用函数的当前指针,用法如下
?
var name="全局阿飞";
function myafei(){this.name="阿飞对象"}
function funX(){alert(this.name)}
funX();
funX.call(window);
funX.call(new myafei());
funX.call(document.getElementById("afeiinput"));
//注:默认的调用对象就是window,所以前两种调用方式结果一样,而后面两个,
//调用的对象分别改成 myafei和页面表单对象,所以打出的值是不同的。
? <input type="text" id="afeiinput" name="afeiinput" value="阿飞表单" />
?
最后的结果是:全局阿飞,全局阿飞,阿飞对象,afeiinput。
?
在java中,我们经常通过实现接口(或者继承类)来重构代码,通过传入不同的对象,来调用不同的方法,我觉得这里应该也可以达到类似的作用,下面我们做个试验。
?
我们现在假如有这样一个场景,就是根据传入的动物的不同来调用不同的eat方法。
代码如下:
/*声明全局对象或者函数*/
function eat(){alert("我要吃")};
/*声明一个猪对象*/
function pigeat(){
this.eat=function(){
alert("我要吃猪草");
}
}
/*声明一个狗对象*/
function dogeat(){
this.eat= function(){
alert("我要吃骨头");
}
}
var pig=new pigeat();
//pig.eat();
var dog=new dogeat();
//dog.eat();
/*适配调用方法*/
function starteat(){
this.eat();
}
starteat();
starteat(window);
starteat.call(pig);
starteat.call(dog);
??
? 重点是最后starteat放入,根据传入不同的对象,就调用了不同方法里面的结果,结果是:我要吃,我要吃,我要吃猪草
,我要吃骨头。
假如需要扩展了,直接加一个动物,实现eat方法,然后传进去就ok了。当然在starteat里面还可以做更多的处理,以实现通用。
?
?
?