首頁 >web前端 >js教程 >JavaScript中神奇的call()方法_javascript技巧

JavaScript中神奇的call()方法_javascript技巧

WBOY
WBOY原創
2016-05-16 16:10:061135瀏覽

先看看關於call()的官方解釋,“調用一個對象的一個方法,以另一個對象替換當前對象。”,看了這樣的解釋,或許讓你更摸不著頭腦了。看範例:

複製程式碼 程式碼如下:

var x = "我是全域變數";    //定義全域變數x
function a(){         //定義函數類別結構a  
    this.x = "我是在函數類別結構a中宣告的哦";   
}
//定義普通函數,彈出目前指標所包含的變數x的值
function f(){      
    alert (this.x);
}
//傳回值為「我是在函數類別結構a中宣告的哦」
f.call(new a());

我的理解是,f.call(new a())就是把函數(其實也是物件)f複製到被呼叫物件「new a()」下面去解析,事實上和下面這段程式碼的解析結果一樣:
複製程式碼 程式碼如下:

function a(){
  this.x = "我是在函數類別結構a中宣告的哦";
  alert(this.x);   
}
a();

只不過此時變數X的作用域不同而已,咿…看起來好像有點繼承的味道哦,難道不是嗎?在上例中,f完全被構造函數a的實力對象繼承了,如果說這還不足以說明a.call(b)是一種繼承模式,那麼再看一個更具有繼承味道的用法吧。
複製程式碼 程式碼如下:

function f(){   
    this.a ="a";   
    this.b = function(){   
        alert("b");
    }
}
function e(){   
    f.call(this);    
}
var c = new e();
alert(c.a);  //彈出a
c.b();    //彈出b

在這個例子中,只要會使用瀏覽器的朋友,都能看得出來e完全繼承了f的屬性和方法,否則是無法解釋的,因為在e中並沒有定義屬性a和b,那麼按常理推斷在e的實例物件c中,並不會出現這兩個屬性。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn