JS中的call()和apply()方法

JavaScript中有一個call和apply方法迄损,其作用基本相同定躏,但也有略微的區(qū)別。

1芹敌、方法定義

call方法:

語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調(diào)用一個對象的一個方法痊远,以另一個對象替換當(dāng)前對象。
說明:

call 方法可以用來代替另一個對象調(diào)用一個方法氏捞。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象碧聪。
如果沒有提供 thisObj 參數(shù),那么 Global 對象被用作 thisObj液茎。

apply方法:

語法:apply([thisObj[,argArray]])

定義:應(yīng)用某一對象的一個方法逞姿,用另一個對象替換當(dāng)前對象。

說明:

如果 argArray 不是一個有效的數(shù)組或者不是 arguments 對象捆等,那么將導(dǎo)致一個 TypeError滞造。

如果沒有提供 argArray 和 thisObj 任何一個參數(shù),那么 Global 對象將被用作 thisObj栋烤, 并且無法被傳遞任何參數(shù)谒养。

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) 蝴光,所以運行結(jié)果為:alert(4); // 注意:js 中的函數(shù)其實是對象,函數(shù)名是對 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來使用了。
//輸入結(jié)果為"Cat"
animal.showName.call(cat, ",");
//animal.showName.apply(cat,[]);

c實現(xiàn)繼承

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對象就能夠直接調(diào)用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 就實現(xiàn)多重繼承了
當(dāng)然满葛,js的繼承還有其他方法径簿,例如使用原型鏈,這個不屬于本文的范疇嘀韧,只是在此說明call 的用法篇亭。說了call ,當(dāng)然還有
apply锄贷,這兩個方法基本上是一個意思译蒂,區(qū)別在于 call
的第二個參數(shù)可以是任意類型,而apply的第二個參數(shù)必須是數(shù)組谊却,也可以是arguments
還有 callee柔昼,caller..

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炎辨,隨后出現(xiàn)的幾起案子捕透,更是在濱河造成了極大的恐慌,老刑警劉巖碴萧,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乙嘀,死亡現(xiàn)場離奇詭異,居然都是意外死亡破喻,警方通過查閱死者的電腦和手機(jī)乒躺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低缩,“玉大人嘉冒,你說我怎么就攤上這事∨胤保” “怎么了讳推?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長玩般。 經(jīng)常有香客問我银觅,道長,這世上最難降的妖魔是什么坏为? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任究驴,我火速辦了婚禮,結(jié)果婚禮上洒忧,老公的妹妹穿的比我還像新娘蝴韭。我一直安慰自己,他們只是感情好熙侍,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布榄鉴。 她就那樣靜靜地躺著,像睡著了一般蛉抓。 火紅的嫁衣襯著肌膚如雪庆尘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天巷送,我揣著相機(jī)與錄音驶忌,去河邊找鬼。 笑死笑跛,一個胖子當(dāng)著我的面吹牛位岔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堡牡,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抒抬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晤柄?” 一聲冷哼從身側(cè)響起擦剑,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芥颈,沒想到半個月后惠勒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡爬坑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年纠屋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾计。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡售担,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出署辉,到底是詐尸還是另有隱情族铆,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布哭尝,位于F島的核電站哥攘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逝淹,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一耕姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栅葡,春花似錦茉兰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽安吁。三九已至醉蚁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬼店,已是汗流浹背网棍。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留妇智,地道東北人滥玷。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像巍棱,于是被迫代替她去往敵國和親惑畴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容