1. 程式人生 > >call和apply

call和apply

{} ray prototype eof bsp str 傳參 clas this

這兩個在講this的時候就遇到了,它們可以改變函數的上下文this,改變其指向

兩者之間唯一的區別就是傳參的不同

obj.call(thisObject,arg1,arg2....);

obj.apply(thisObject,[arg1,arg2....]);

如果參數已經確定,就可以直接用call就行了,如果參數是動態的,那麽用apply比較合適

例子

 1 function cat(){};
 2 cat.prototype={
 3     food:"fish",
 4     say:function(){
 5         alert("I love"+this.food);
6 } 7 } 8 var newCat = new cat(); 9 newCat.say(); // I love fish 10 11 var dog = {food:"bone"}; 12 newCat.say.call(dog); //I love bone

這邊把newCat中this指向了dog。

換個角度想一下,這算不算實現了繼承呢

1 var parent=function(){
2    this.name="jsc";
3    this.age = 25;
4 }
5 var child={};
6 console.log(child);    //
{}對象 7 8 parent.call(child); 9 console.log(child); //{name:"jsc",age:25}

判斷變量類型時可以使用

我們在使用typeof判斷變量類型的時候,如果是array,Date等,都返回object,所以就沒法判斷具體是哪一種了

這時候可以使用call

例如

1 var array = [];
2 
3 console.log(typeof array);   //  object
4 
5 Object.prototype.toString.call(array); //[object,array]

call和apply