国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

基于JavaScript實現繼承機制之調用call()與apply()的方法詳解

2024-05-06 15:48:07
字體:
來源:轉載
供稿:網友
本文將介紹兩種很類似于對象冒充的繼承方式,即使用call()和apply()方法

call() 方法

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

復制代碼 代碼如下:


function sayHello(sPrefix,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;
this.sayColor = function () {
alert(this.color);
};
}


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

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


這里,我們需要讓 ClassA 中的關鍵字 this 等于新創建的 ClassB 對象,因此 this 是第一個參數。第二個參數 sColor 對兩個類來說都是唯一的參數。

apply() 方法

apply() 方法有兩個參數,用作 this 的對象和要傳遞給函數的參數的數組。例如:

復制代碼 代碼如下:


function sayColor(sPrefix,sSuffix) {
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(color);
//delete this.newMethod;
ClassA.apply(this, new Array(sColor));

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


同樣的,第一個參數仍是 this,第二個參數是只有一個值 color 的數組??梢园?ClassB 的整個 arguments 對象作為第二個參數傳遞給 apply() 方法:

復制代碼 代碼如下:


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

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


當然,只有超類中的參數順序與子類中的參數順序完全一致時才可以傳遞參數對象。如果不是,就必須創建一個單獨的數組,按照正確的順序放置參數。此外,還可使用 call() 方法。

我們可以看到這兩個方法能夠很好的代替原始的對象冒充,使寫法上變得稍微簡單。但是這些方法的弊端是子類不能繼承父類在原型鏈上聲明的方法或屬性,針對這個問題下一篇文章將會介紹JavaScript中另一種實現繼承的方式—原型鏈繼承。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 江孜县| 田阳县| 邹城市| 安徽省| 岢岚县| 寿光市| 晴隆县| 卢氏县| 正镶白旗| 兴业县| 高密市| 广平县| 年辖:市辖区| 丰镇市| 确山县| 福泉市| 广元市| 敦煌市| 张掖市| 图片| 本溪| 平原县| 辉南县| 新昌县| 山西省| 广南县| 洞头县| 南木林县| 昭觉县| 扎赉特旗| 大新县| 长岭县| 平阳县| 正定县| 淮安市| 怀远县| 广灵县| 东源县| 广饶县| 依兰县| 孟连|