這兩個在講this的時候就遇到了,它們可以改變函數的上下文this,改變其指向 兩者之間唯一的區別就是傳參的不同 obj.call(thisObject,arg1,arg2....); obj.apply(thisObject,[arg1,arg2....]); 如果參數已經確定,就可以直接用cal ...
這兩個在講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]