js方法call和apply執行個體解析

來源:互聯網
上載者:User

標籤:style   blog   class   code   java   tar   

在js編程中實現繼承時 用到了兩個很特殊的方法,call和apply。

在ECMAScript v3中,給Function原型定義了這兩個方法,這兩個方法的作用都是一樣的:使用這兩個方法可以像調用其他對象方法一樣調用函數,這句話是從書上抄的,至少我是沒讀明白這是什麼意思。
下面說簡單易懂的,先看段代碼:

function Introduce(name,age) { document.write("My name is "+name+".I am "+age); } var p=new People(); Introduce.call(p,"Windking",20); 

就說上面的這段代碼,用了call之後,Introduce就成了p的方法,不知道這樣說你明白了嗎?

使用了call方法,上述的代碼就等同於了這個代碼:

function People(name,age) { this.name=name; this.age=age; this.Introduce=function(){ document.write("My name is "+name+".I am "+age); }; } 

明白意思了嗎?apply也是一樣的作用。 

好,我們不管這個方法到底能在實際中用到什麼,先講文法。
call接受至少一個參數,call的第一個參數是指你所需要的對象,比如說上面的那個例子,Introduce方法希望他能夠被對象p所調用,那麼就把p作為call的第一個參數。剩餘的參數個數是任意的,作用是作為Introduce方法的參數。順序按照Introduce參數聲明的順序。比如Introduce.call(p,"Windking",20),假如Introduce是p的一個執行個體方法,那麼也就是這樣的:p.Introduce("Windking",20)。明白了嗎?記住,傳入參數的順序要與函式宣告參數的順序保持一致。  www.jbxue.com
瞭解了call,apply方法就容易理解了,apply和call唯一的區別是call接受至少一個參數,而apply只接受兩個參數,第一個參數與call一樣,第二個參數是一個帶下標的集合,比如說Introduce.call(p,"Windking",20)就可以改寫成Introduce.apply(p,["Windking",20])了。這次明白了嗎?
那究竟這兩個方法有什麼用呢?如果我們只是為了實現上面的那個功能,把Introduce實現為People的方法不是更好嗎?

我把應用總結為兩條:
1.共用方法。先看代碼:

function Introduce(name,age) { document.write("My name is "+name+".I am "+age); } 

這是一個自我介紹的方法,現在假設有一個男孩的類,和一個女孩的類(在這裡我只是為了示範,在實際中,會用一個People的父類),因為他們的Introduce都是一樣的,於是我們就可以共用這個方法。

function Boy() { this.BoyIntroduce=function(){ Introduce.call(this,name,age); }; } 

同理,Girl中也是一樣,這樣的話,我們就可以避免寫代碼了。其實這個有些牽強,因為我們完全也可以寫成:

function Boy() { this.BoyIntroduce=function(){ Introduce(name,age); } } 

但是這個時候,我們如果用Apply的話,就看上去簡單多了:

function Boy() { this.BoyIntroduce=function(){ Introduce.apply(this,arguments); }; } 

是不是簡單了很多呢?如果參數很多的話,那麼是不是不用再寫那麼一場串密密麻麻的參數了呢!

2.跨域調用 www.jbxue.com
一個簡單的例子(僅為示範,無任何價值):

function Boy(name,age) { this.BoyIntroduce=function(){ document.write("My name is "+name+".I am "+age); } } function Girl(name,age) {} 

這是一個Boy和一個Girl類,然後我們寫如下的代碼:

var b=new Boy("Windking",20); b.BoyIntroduce();

這沒有任何異議。假設有一天有一個女孩也希望做一下自我介紹,只是偶然用一下,那麼我就沒有必要修改Girl類,因為其他的女孩比較害羞,不喜歡自我介紹。那麼這個時候我就可以這樣。

var g=new Girl("Xuan",22); Introduce.call(g,"Xuan",22);

3,真正用處——繼承

下面才是call和apply最廣泛的應用,就是用於構造繼承。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.