首頁  >  文章  >  web前端  >  Javascript中call的兩種用法實例_javascript技巧

Javascript中call的兩種用法實例_javascript技巧

WBOY
WBOY原創
2016-05-16 17:09:15944瀏覽

用法一(常見用法):

表現形式為:一個對象.方法.call(另一個對象),意義是用另一個對象代替當前對象,執行當前對象的方法。先看範例:

複製程式碼 程式碼如下:

function Class1(){


f "class1";
    this.showName = function(){
        alert(this.name);
    }}
var c1 = new Class1();
var c2 = new Class2();
c1.showName.call(c2);

c2.showName();        //執行

我們先分別定義了兩個function,分別是Class1和Class2,它們的主要差異是Class2比Class1多了一個showName()方法。接著定義了與Class1、Class2對應的物件c1和c2,這時候我們清醒的知道,c1有showName()方法而c2沒有。但奇蹟出現了,當我們執行 c1.shoName.call(c2) 時,會彈出c2的name值,也就是"class2"。其實,我們執行的任然是c1的方法,只不過臨時起意地把物件c2偷換成物件c1,執行完畢後,它們任然是定義時的樣子,c2並沒有因此多了些什麼方法。為了偵測c2有沒有多了方法,範例加了行 c2.showNmae(); 它是不能被執行的,瀏覽器會報出 Object # has no method 'showName' 的錯誤。

為什麼要這麼做?前面說了,這是一種臨時起意的使用方法,我們就是利用其高效率的程式設計而已。但這並不是沒有限制的,假設用c1和c2表示被替換的對象和替換對象,用fun1表示c1固有的方法。 1.當fun1不需要參數,且不用到父函數中的任意局部變數時,其實c1.fun1.call(c2) 和c1.fun1() 沒什麼區別;2、當fun1不需要參數但是用到父函數中的變量,那麼就要求生成c1和c2的function有相同名稱的那些個被fun1使用的變量;3、當fun1需要參數時,形式要改寫成c1.fun1.call(c2, 參數1, 參數2 , ...參數n),這時候產生c1的function中的變數名稱就不必和產生c2的function的變數名稱同名了,只需對應即可。其實,我們在用到call的這種用法時,c2和c1往往在結構和功能上已經有很大的相似性了,所以上述三點很容易避免。

用法二:

在function的定義過程中使用,表現形式:另一個已存在函數.call(this),它可以將另一個已存在函數的變數、方法統統克隆到自己的函數中,實現一種類似於繼承的功能。看例子:

複製程式碼 程式碼如下:
function Animal(name){


function Animal(name){
 . = name;
    this.showName = function(){
        alert(this.name);    }

};

var animal = new Animal("small_animal");

animal.showName();    //alert("small_animal")

function Cat(name){

    Animal.call(this, name);

};

//var Animal = null;    //取消註解試試看

var cat = new Cat("black_cat");

cat.showName();     //alert("black_cat")
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn