call([thisObj[,arg1[, arg2[, [,.argN]]]]])?
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。?
?
thisObj?可選項。將被用作當前對象的對象。?
arg1, arg2, , argN?可選項。將被傳遞方法參數序列。?
如果沒有提供 thisObj 參數,那么 Global 對象被用作 thisObj。?
-------------------------------------------------------------------------------------------?
obj1.method1.call(obj2,argument1,argument2)?
如上,call 的作用就是把 obj1 的方法放到 obj2 上使用,后面的 argument1.. 這些做為參數傳入.?
舉一個具體的例子?
function add(a,b)?
{?
??? alert(a+b);?
}?
function sub(a,b)?
{?
??? alert(a-b);?
}?
add.call(sub,3,1);?
這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果為:alert(4); // 注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。?
看一個稍微復雜一點的例子?
function Class1()?
{?
??? this.name = "class1";?
??? this.showNam = function()?
??? {?
??????? alert(this.name);?
??? }?
}?
function Class2()?
{?
??? this.name = "class2";?
}?
var c1 = new Class1();?
var c2 = new Class2();?
c1.showNam.call(c2);?
注意,call 的意思是把 c1 的方法放到 c2 上執行,原來 c2 是沒有 showNam() 方法,現在是把 c1 的 showNam() 方法放到 c2 上來執行,所以 this.name 應該是 class2,執行的結果就是 :alert("class2");?
怎么樣,覺得有意思了吧,可以讓 a 對象來執行 b 對象的方法,這是 java 程序員所不敢想的。還有更有趣的,可以用 call 來實現繼承?
function Class1()?
{?
??? this.showTxt = function(txt)?
??? {?
??????? alert(txt);?
??? }?
}?
function Class2()?
{?
??? Class1.call(this);?
}?
var c2 = new Class2();?
c2.showTxt("cc");?
這樣 Class2 就繼承 Class1 了,Class1.call(this) 的 意思就是使用 Class1 對象代替 this 對象,那么 Class2 中不就有 Class1 的所有屬性和方法了嗎,c2 對象就能夠直接調用 Class1 的方法以及屬性了,執行結果就是:alert("cc");?
對的,就是這樣,這就是 javaScript 如何來模擬面向對象中的繼承的,還可以實現多重繼承。?
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 的第二個參數必須是數組?
?
參考:js call
?