JS中的call()和apply()方法
1、方法定義
call方法:
語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:呼叫一個物件的一個方法,以另一個物件替換當前物件。
說明:
call 方法可以用來代替另一個物件呼叫一個方法。call 方法可將一個函式的物件上下文從初始的上下文改變為由 thisObj 指定的新物件。
如果沒有提供 thisObj 引數,那麼 Global 物件被用作 thisObj。
apply方法:
語法:apply([thisObj[,argArray]])
定義:應用某一物件的一個方法,用另一個物件替換當前物件。
說明:
如果 argArray 不是一個有效的陣列或者不是 arguments 物件,那麼將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個引數,那麼 Global 物件將被用作 thisObj, 並且無法被傳遞任何引數。
2、常用例項
a、
- 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 物件的引用。
b、
- function Animal(){
- this.name = "Animal";
- this.showName = function(){
- alert(this.name);
- }
- }
- function Cat(){
- this.name = "Cat";
- }
- var animal = new Animal();
- var cat = new Cat();
- //通過call或apply方法,將原本屬於Animal物件的showName()方法交給物件cat來使用了。
- //輸入結果為"Cat"
- animal.showName.call(cat,",");
- //animal.showName.apply(cat,[]);
call 的意思是把 animal 的方法放到cat上執行,原來cat是沒有showName() 方法,現在是把animal 的showName()方法放到 cat上來執行,所以this.name 應該是 Cat
c、實現繼承
- function Animal(name){
- this.name = name;
- this.showName = function(){
- alert(this.name);
- }
- }
- function Cat(name){
- Animal.call(this, name);
- }
- var cat = new Cat("Black Cat");
- cat.showName();
Animal.call(this) 的意思就是使用 Animal物件代替this物件,那麼 Cat中不就有Animal的所有屬性和方法了嗎,Cat物件就能夠直接呼叫Animal的方法以及屬性了.
d、多重繼承
- 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
還有 callee,caller..
===========================
專案中運用call
MJCards.prototype.touchCardsEndCallback = null;//增加MJCards成員變數和方法 add liudezu MJCards.prototype.setTouchCardsEndCallback = function (callback) { this.touchCardsEndCallback = callback; }; var superTouchEnd = MJCards.prototype.onTouchEnded; MJCards.prototype.onTouchEnded = function (touch, event) {//擴加MJCards的onTouchEnded方向的內容 add liudezu superTouchEnd.call(this , touch, event); if(this.touchCardsEndCallback){ this.touchCardsEndCallback(); } };MJCards.prototype.**** 為MJCards 新增成員變數touchCardsEndCallback 以及方法setTouchCardsEndCallback
MJCards本身擁有onTouchEnded,如果想在MJCards類外面對onTouchEnded新增一些新的內容,則如上操作。
相關文章
- 【轉】JS中的call()和apply()方法JSAPP
- JS中的call()方法和apply()方法用法總結JSAPP
- JS中的call、apply、bind方法JSAPP
- JS中apply和call的用法JSAPP
- 理解JS中的call、apply、bind方法(********************************************************JSAPP
- js中的call、applyJSAPP
- js中call,apply和bind方法的區別和使用場景JSAPP
- JS中的call、apply、bindJSAPP
- 重寫JS中的apply,call,bind,new方法JSAPP
- 簡單快速理解js中的this、call和applyJSAPP
- js中call、apply、bind的用法JSAPP
- JavaScript中的call()和apply()JavaScriptAPP
- js中call、apply、bind的區別JSAPP
- 模擬js中的call、apply和bind的實現JSAPP
- js中call、apply、bind函式JSAPP函式
- 快速掌握javascript的apply()和call()方法JavaScriptAPP
- JS中改變this的指向 call、apply 和 bind 的區別JSAPP
- 隨筆——js中的this指向,apply()與 call()JSAPP
- js的繼承方法小結(prototype、call、apply)JS繼承APP
- JavaScript中call,apply,bind方法的總結。JavaScriptAPP
- JavaScript中call,apply,bind方法的總結JavaScriptAPP
- this、call和applyAPP
- 對javascript中的call()和apply()的理解JavaScriptAPP
- 從一行等式理解JS當中的call, apply和bindJSAPP
- 談談JavaScript中的call、apply和bindJavaScriptAPP
- 淺談JavaScript中的apply、call和bindJavaScriptAPP
- 徹底理解了call()方法,apply()方法和bind()方法APP
- js深入之實現call、apply和bindJSAPP
- js call、apply、bind的實現JSAPP
- 深入理解JS的apply()、call()JSAPP
- this, call, apply 和 bindAPP
- 快速理解JavaScript中call和apply原理JavaScriptAPP
- 使用JS簡單實現一下apply、call和bind方法JSAPP
- JavaScript 中的 apply、call、bindJavaScriptAPP
- js之call,apply和bind的模擬實現JSAPP
- call()和apply()方法使用程式碼例項APP
- js call,apply,bind總結JSAPP
- JS中bind、call和apply的作用以及在TS裝飾器中的用法JSAPP