call與apply的方法定義:
call方法:
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明:
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 this指定的新對象。
==================================
apply方法:
function.apply(thisObj[, argArray])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
apply:最多只能有兩個參數——新this對象和一個數組argArray。如果給該方法傳遞多個參數,則把參數都寫進這個數組里面,當然,即使只有一個參數,也要寫進數組里。如果argArray不是一個有效的數組或arguments對象,那么將導致一個TypeError。如果沒有提供argArray和thisObj任何一個參數,那么Global對象將被用作thisObj,并且無法被傳遞任何參數。
call:它可以接受多個參數,第一個參數與apply一樣,后面則是一串參數列表。這個方法主要用在js對象各方法相互調用的時候,使當前this實例指針保持一致,或者在特殊情況下需要改變this指針。如果沒有提供thisObj參數,那么 Global 對象被用作thisObj。
實際上,apply和call的功能是一樣的,只是傳入的參數列表形式不同。
function jia(a,b)
{
alert(a+b);
}
function jian(a,b)
{
alert(a-b);
}
jia.call(jian,3,1);
看最后一句代碼jia.call(sub,3,1);
其實等同于 jia(3,1)
;結果為4;
還可以這樣寫jia.call(this,3,1);
結果也是一樣的; 這個例子中的意思就是用 jia來替換 jian方法;
如過把它用apply寫的話就是jia.apply(this,[3,1]);
或者jia.apply(jian,[3,1]);
;
這里要注意的是,js 中的函數其實是對象,函數名是對 Function 對象的引用。
function Animal(){
this.name = "dog";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal(); //new新的實例
var cat = new Cat();
animal.showName.call(cat,",");
animal.showName.apply(cat,[]);
這段代碼的意思其實就是,把 animal 的方法放到cat上執行,原來是沒有showName的方法的,現在可以用了!輸出的結果為‘Cat’;
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.call(this, name);
}
var cat = new Cat("Cat");
cat.showName();
Animal.call(this) 的意思就是使用 Animal對象代替this對象,Cat對象就能夠直接調用Animal的方法以及屬性了,這里實現的是方法的繼承;cat繼承Animal里面的name;
function Class10()
{
this.showSub = function(a,b)
{
alert(a-b);
}
}
function Class11()
{
this.showAdd = function(a,b)
{
alert(a+b);
}
}
function Class2()
{
Class10.call(this);
Class11.call(this);
}
很簡單,使用兩個 call 就實現多重繼承了,當然,js的繼承還有其他方法,例如使用原型鏈,只是在此說明call 的用法。說了call ,當然還有 apply,這兩個方法基本上是一個意思,區別在于 call 的第二個參數可以是任意類型,而apply的第二個參數必須是數組,也可以是arguments;
apply的一些其他巧妙用法(借鑒)
(1)Math.max 可以實現得到數組中最大的一項:
因為Math.max不支持Math.max([param1,param2])也就是數組,但是它支持Math.max(param1,param2...),所以可以根據apply的特點來解決 var max=Math.max.apply(null,array),這樣就輕易的可以得到一個數組中的最大項(apply會將一個數組轉換為一個參數接一個參數的方式傳遞給方法)
這塊在調用的時候第一個參數給了null,這是因為沒有對象去調用這個方法,我只需要用這個方法幫我運算,得到返回的結果就行,所以直接傳遞了一個null過去。
用這種方法也可以實現得到數組中的最小項:Math.min.apply(null,array)
(2)Array.prototype.push可以實現兩個數組的合并
同樣push方法沒有提供push一個數組,但是它提供了push(param1,param2...paramN),同樣也可以用apply來轉換一下這個數組,即:
1.var arr1=new Array("1","2","3");
2.var arr2=new Array("4","5","6");
3.Array.prototype.push.apply(arr1,arr2); //得到合并后數組的長度,因為push就是返回一個數組的長度也可以這樣理解,arr1調用了push方法,參數是通過apply將數組轉換為參數列表的集合