[JavaScript]call與apply的使用方法

作為一款面向?qū)ο笳Z言,js中很多的方法都是被封裝在構(gòu)造函數(shù)中的梢褐,這些封裝的方法只有特定的對象能夠訪問挑社。而有些時候,我們希望能通過“借用”某個構(gòu)造函數(shù)prototype中的方法顿痪,來實現(xiàn)某些取巧的功能镊辕。以下總結(jié)了一些call和apply的區(qū)別和使用方法。

一蚁袭、區(qū)別

call和apply都是用來借用類方法使用的征懈。而在使用時,區(qū)別就在于call和apply所需要的參數(shù)形勢不同揩悄。

this.method.apply(newThis,[arguments]);

this.method.call(newThis,argument1[,argument2[,augument3...]]);

在使用時卖哎,會用newThis替換this,作為方法的作用對象删性。apply方法的參數(shù)是以一個數(shù)組的形式傳入的亏娜,因此我們可以利用這一特征,對一些不支持?jǐn)?shù)組參數(shù)的方法進(jìn)行拓展(比如arr.push())蹬挺。

二维贺、使用范例

在構(gòu)造算法時,我們經(jīng)常會需要對傳入的參數(shù)進(jìn)行類型判斷巴帮,進(jìn)而達(dá)到保護(hù)函數(shù)的效果溯泣。而在判斷參數(shù)類型時虐秋,typeof可以正確的識別六大基礎(chǔ)數(shù)據(jù)類型(string,number,boolean,undefined,object null也是object;),在識別對象類型時垃沦,除了function的返回值是"function"以外客给,其他的對象類型都會返回"object"(這是因為其他的構(gòu)造函數(shù)都是繼承自Function原型)。為了正確識別所有的基礎(chǔ)數(shù)據(jù)類型和內(nèi)置對象類型肢簿,我們會使用Object.prototype.toString.call(obj)來判斷靶剑。(注意此方法不能判斷自定義對象類型。)

三池充、使用技巧

call和apply在一些不支持?jǐn)?shù)組類型參數(shù)的方法上有著特別的作用抬虽。比如:

var arr1 = [1,2,3];

var arr2 = [4,5,6];

Array.prototype.push.apply(arr1,arr2);//會返回arr1的新長度,即6纵菌,arr1此時變?yōu)閇1,2,3,4,5,6]

數(shù)組中push方法用來給數(shù)組1添加數(shù)據(jù)阐污。而參數(shù)不支持?jǐn)?shù)組。在使用apply方法時咱圆,會將參數(shù)arr2分解開來笛辟,化為一個一個的參數(shù)傳入,這樣就解決了難以連接兩個數(shù)組的尷尬序苏。注意合成arr2被添加在arr1的后面手幢,而返回值是新的arr1中數(shù)據(jù)的個數(shù)。

同樣忱详,在Math.max判斷一組參數(shù)中最大值的時候围来,也不支持?jǐn)?shù)組類型參數(shù)。這個時候我們可以使用Math.max.apply(Math,[12,45,23])來傳入一個數(shù)組匈睁。判斷最小值同理监透。

四、總結(jié)以及其他用途

call和apply不僅可以借用系統(tǒng)的默認(rèn)方法航唆,也可以借用自定義構(gòu)造函數(shù)中的方法甚至構(gòu)造函數(shù)本身(這樣的話將會調(diào)用構(gòu)造函數(shù)胀蛮,若傳入的參數(shù)是(this,arguments),那么調(diào)用的構(gòu)造函數(shù)中的對象也會被復(fù)制到this構(gòu)造函數(shù)中)糯钙。

function Name(name){
  this.name = name;
  this.introduce = function(){
    alert(this.name);
  };
}//名稱構(gòu)造函數(shù)粪狼,包括一個姓名,一個彈出姓名的方法任岸。
function People(name, age, classNo){
  Name.apply(this,arguments);
  this.age = age;
  this.classNo = classNo;
}//創(chuàng)建一個人物構(gòu)造函數(shù)再榄,在創(chuàng)建時,調(diào)用Name構(gòu)造函數(shù)
 
var Alex = new People("Alex", 21, "six");//創(chuàng)建一個People實例享潜,而在實例被構(gòu)造時
//會先調(diào)用Name.apply(this,arguments)語句困鸥,這里的this為Alex實例。則米碰,構(gòu)造函數(shù)Name中的name對象窝革,introduce方法都會被創(chuàng)建在Alex實例中。
Alex.name;//"Alex"
Alex.introduce();//alert
Alex.age;//21
Alex.classNo;//"six"

在使用時應(yīng)當(dāng)注意使用的方式吕座,靈活應(yīng)用虐译。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吴趴,隨后出現(xiàn)的幾起案子漆诽,更是在濱河造成了極大的恐慌,老刑警劉巖锣枝,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厢拭,死亡現(xiàn)場離奇詭異,居然都是意外死亡撇叁,警方通過查閱死者的電腦和手機(jī)供鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陨闹,“玉大人楞捂,你說我怎么就攤上這事∏骼鳎” “怎么了寨闹?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長君账。 經(jīng)常有香客問我繁堡,道長,這世上最難降的妖魔是什么乡数? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任椭蹄,我火速辦了婚禮,結(jié)果婚禮上净赴,老公的妹妹穿的比我還像新娘塑娇。我一直安慰自己,他們只是感情好劫侧,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布埋酬。 她就那樣靜靜地躺著,像睡著了一般烧栋。 火紅的嫁衣襯著肌膚如雪写妥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天审姓,我揣著相機(jī)與錄音珍特,去河邊找鬼。 笑死魔吐,一個胖子當(dāng)著我的面吹牛扎筒,可吹牛的內(nèi)容都是我干的莱找。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嗜桌,長吁一口氣:“原來是場噩夢啊……” “哼奥溺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骨宠,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤浮定,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后层亿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桦卒,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年匿又,在試婚紗的時候發(fā)現(xiàn)自己被綠了方灾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡碌更,死狀恐怖迎吵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情针贬,我是刑警寧澤击费,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站桦他,受9級特大地震影響蔫巩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜快压,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一圆仔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔫劣,春花似錦坪郭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嫌松,卻和暖如春沪曙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萎羔。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工液走, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓缘眶,卻偏偏與公主長得像嘱根,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巷懈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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