日期:2014-05-16 浏览次数:20323 次
? 看到别人在讨论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里面还可以做更多的处理,以实现通用。
?
?
?