日期:2014-05-16  浏览次数:20332 次

js可以这么用(二)

? 看到别人在讨论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里面还可以做更多的处理,以实现通用。

?

?

?