首頁 > web前端 > js教程 > 基於JavaScript實作繼承機制之呼叫call()與apply()的方法詳解_基礎知識

基於JavaScript實作繼承機制之呼叫call()與apply()的方法詳解_基礎知識

WBOY
發布: 2016-05-16 17:34:21
原創
912 人瀏覽過

call() 方法

call() 方法是與經典的物件冒充方法最相似的方法。它的第一個參數用作 this 的物件。其他參數都直接傳遞給函數本身。 例如:

複製程式碼 程式碼如下:


程式碼如下:

,sSuffix) {
    alert(this.name 」says「 sPrefix sSuffix);

};


var obj = new Object();

obj.name = "Tom";
sayHello.call(obj, "Hello ", "World.");


在這個例子中,函數sayHello() 在物件外定義,即使它不屬於任何對象,也可以引用關鍵字this。物件 obj 的 name屬性等於 blue。當呼叫 call() 方法時,第一個參數是 obj,說明應該賦予 sayHello() 函數中的 this 關鍵字值是 obj。第二個和第三個參數是字串。它們與 sayHello() 函數中的參數 sPrefix 和 sSuffix 匹配,最後產生的訊息 "Tom says Hello World." 將會顯示出來。 要與繼承機制的物件冒充方法一起使用該方法,只需將前三行的賦值、呼叫和刪除程式碼替換即可:
複製程式碼


程式碼如下:


function ClassA(sColor) {
    this.color = sColor;  alert(this.color);

    };
}


function ClassB(sColor, sName) {
    //this.newMethod = ClassA;

    //this.newMethod(color);

  ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
       alert(this.name);

       alert(this.name);
       alert(s我們需要讓ClassA 中的關鍵字this 等於新建立的ClassB 對象,因此this 是第一個參數。第二個參數 sColor 對兩個類別來說都是唯一的參數。

apply() 方法

apply() 方法有兩個參數,用作 this 的物件和要傳遞給函數的參數的陣列。 例如:

複製程式碼 程式碼如下:


程式碼如下:

    alert(sPrefix this.color sSuffix);

};


var obj = new Object();

obj.color = "blue";
sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));


這個例子與前面的例子相同,只是現在調用的是apply() 方法。當呼叫 apply() 方法時,第一個參數仍是 obj,說明應該賦予 sayColor() 函數中的 this 關鍵字值是 obj。第二個參數是由兩個字串構成的數組,與sayColor() 函數中的參數sPrefix 和sSuffix 匹配,最後產生的訊息仍是"The color is blue, a very nice color indeed.",將被顯示出來。

此方法也用於取代前三行的賦值、呼叫和刪除新方法的程式碼:
複製程式碼



複製程式碼

程式碼如下:



function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
      //this.newMethod = ClassA;
   ); >    //delete this.newMethod;

    ClassA.apply(this, new Array(sColor));

    this.name = sName;
    this.sayName = function () {        alert(this.name);       alert(this.name);       alert(this.name);       alert(this.name);       alert(
複製程式碼複製程式碼 程式碼>

function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(color);
//this.newMethod;
を削除ClassA.apply(this, argument);

this.name = sName;
this.sayName = function () {
alert(this.name);
};
}


もちろんです, パラメーター オブジェクトは、スーパークラス内のパラメーターの順序がサブクラス内のパラメーターの順序とまったく同じである場合にのみ渡すことができます。そうでない場合は、パラメータを正しい順序で指定した別の配列を作成する必要があります。さらに、call() メソッドを使用することもできます。

これら 2 つのメソッドは元のオブジェクトの偽装を非常にうまく置き換えることができ、記述が若干単純になることがわかります。ただし、これらのメソッドの欠点は、サブクラスがプロトタイプ チェーン上の親クラスによって宣言されたメソッドや属性を継承できないことです。この問題に対処するために、次の記事では、JavaScript で継承を実装する別の方法であるプロトタイプ チェーン継承を紹介します。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板