深入理解apply罩润,call的區(qū)別及應(yīng)用場景

帶著以下問題看文章:

什么是apply祝峻、call莱找,有什么區(qū)別

apply奥溺、call是用來做什么的桦卒,在哪些場景下應(yīng)用

方法定義:

call方法:call(obj,x,y,z,.....)

調(diào)用一個對象的一個方法裕偿,以另一個對象替換當(dāng)前對象

call方法可以用來代替另一個對象調(diào)用一個方法(本身無該方法,才選擇調(diào)用)嗦锐。call方法可以將一個函數(shù)的上下文從初始的對象轉(zhuǎn)成obj指向的新對象奕污。

如果沒有提供obj對象,那么Global對象被指做obj液走。

apply方法:apply(obj,[x,y,z])

應(yīng)用某一對象的一個方法碳默,用另一個對象替換當(dāng)前對象。

如果第二個參數(shù)不是一個有效的數(shù)組或者不是arguments對象缘眶,將會報錯TypeError

如果沒提供obj對象嘱根,那么Global對象被指做obj。

應(yīng)用場景:

1巷懈,函數(shù)之間的相互調(diào)用

function add(a,b){

? ? ? alert(a+b);

}

function sub(a,b){

? ? alert(a-b);

}

add.call(sub,5,6); //彈出11该抒,對象替換,等等這不是函數(shù)嗎顶燕?凑保? ?其實函數(shù)名是Function對象的引用。

思考:用apply怎么寫呢涌攻?

add.apply(sub,[5,6]); 也是彈出11欧引,從這里可以看出apply和call的參數(shù)方式是不一樣的,call的參數(shù)適合用于可明確值癣漆,且簡短的參數(shù)维咸,apply的參數(shù)適合用于數(shù)組元素較多的場景

2,構(gòu)造函數(shù)之間的調(diào)用

function Person(){

? ? ?this.age = 50;

? ? ?this.showAge= function(){

? ? ? ? ? ? alert(this.age);

? ? }

}

function Son(){

? ? this.age ?= 20;

}

var father ?= new Person();

var xiaoming = new Son();

此時 father.showAge()是正常執(zhí)行的惠爽,xiaoming.showAge()是undefined癌蓖,為啥undefined呢,屬性不存在均為undefined

xiaoming 是沒有showAge方法的婚肆,那如果想要知道xiaoming的年齡呢租副?

father.showAge.apply(xiaoming) //立即執(zhí)行顯示20

father.showAge.call(xiaoming)//立即執(zhí)行顯示20

xiaoming.showAge();報錯,會說showAge() is not a function

此時說明將方法應(yīng)用于另一個對象時用僧,僅僅是對另一個對象執(zhí)行此方法,結(jié)束之后赞咙,該對象不擁有此方法责循,

那么如果想要另一個對象也擁有這個方法呢?

還是剛剛的例子攀操,我們在Son方法中添加代碼:

function Son(){

? ? this.age ?= 20;

? ? Person.call(this);

? ?//Person.apply(this)

}

這里需要注意的是重新定義Son方法之后院仿,需給xiaoming重新賦值,不然獲取不到剛剛修改的showAge,

再執(zhí)行xiaoming.showAge(),結(jié)果顯示可以使用這個方法了歹垫,但是彈出的值是50剥汤,想想看為什么?

多重繼承

使用多個call 或者apply 即可排惨。

場景1:找出一個數(shù)組的最大值或最小值吭敢,數(shù)組值很多且不定

var arr ?= [1,2,3,.......n]

Math.min.apply(this,arr),this可隨便換暮芭,但需是一個對象

為什么不用call鹿驼?參數(shù)不定且太多,無法書寫谴麦,

場景2:var arr1= [1,2,3],arr2= [5,6,7,8]蠢沿。將arr2的值放入到arr1中

首先想到的是什么方法,contact匾效?for循環(huán) 然后push?

用apply可一行代碼解決:Arrray.prototype.push.apply(arr1,arr2)


contact方法返回的是新數(shù)組恤磷,而不是直接改變arr1的值面哼。

引入另外一個話題:數(shù)組方法哪些是改變原數(shù)組的,哪些是不會改變原數(shù)組的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扫步,一起剝皮案震驚了整個濱河市魔策,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌河胎,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡河哑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古涧,“玉大人,你說我怎么就攤上這事。” “怎么了有梆?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵痰催,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任厕怜,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粥航。我一直安慰自己琅捏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布递雀。 她就那樣靜靜地躺著柄延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缀程。 梳的紋絲不亂的頭發(fā)上搜吧,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音杨凑,去河邊找鬼滤奈。 笑死,一個胖子當(dāng)著我的面吹牛撩满,可吹牛的內(nèi)容都是我干的蜒程。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼伺帘,長吁一口氣:“原來是場噩夢啊……” “哼搞糕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曼追,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汉规,沒想到半個月后礼殊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡针史,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年晶伦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄枕。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡婚陪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出频祝,到底是詐尸還是另有隱情泌参,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布常空,位于F島的核電站沽一,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漓糙。R本人自食惡果不足惜铣缠,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝗蛙,春花似錦蝇庭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至病曾,卻和暖如春牍蜂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泰涂。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工鲫竞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逼蒙。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓从绘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親是牢。 傳聞我的和親對象是個殘疾皇子僵井,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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