基于JavaScript實(shí)現(xiàn)繼承機(jī)制之調(diào)用call()與apply()的方法詳解
call() 方法
call() 方法是與經(jīng)典的對(duì)象冒充方法最相似的方法。它的第一個(gè)參數(shù)用作 this 的對(duì)象。其他參數(shù)都直接傳遞給函數(shù)自身。例如:
function sayHello(sPrefix,sSuffix) {
alert(this.name + ”says“ + sPrefix + sSuffix);
};
var obj = new Object();
obj.name = "Tom";
sayHello.call(obj, "Hello ", "World.");
在這個(gè)例子中,函數(shù) sayHello() 在對(duì)象外定義,即使它不屬于任何對(duì)象,也可以引用關(guān)鍵字 this。對(duì)象 obj 的 name屬性等于 blue。調(diào)用 call() 方法時(shí),第一個(gè)參數(shù)是 obj,說(shuō)明應(yīng)該賦予 sayHello() 函數(shù)中的 this 關(guān)鍵字值是 obj。第二個(gè)和第三個(gè)參數(shù)是字符串。它們與 sayHello() 函數(shù)中的參數(shù) sPrefix 和 sSuffix 匹配,最后生成的消息 "Tom says Hello World." 將被顯示出來(lái)。
要與繼承機(jī)制的對(duì)象冒充方法一起使用該方法,只需將前三行的賦值、調(diào)用和刪除代碼替換即可:
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 中的關(guān)鍵字 this 等于新創(chuàng)建的 ClassB 對(duì)象,因此 this 是第一個(gè)參數(shù)。第二個(gè)參數(shù) sColor 對(duì)兩個(gè)類來(lái)說(shuō)都是唯一的參數(shù)。
apply() 方法
apply() 方法有兩個(gè)參數(shù),用作 this 的對(duì)象和要傳遞給函數(shù)的參數(shù)的數(shù)組。例如:
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."));
這個(gè)例子與前面的例子相同,只是現(xiàn)在調(diào)用的是 apply() 方法。調(diào)用 apply() 方法時(shí),第一個(gè)參數(shù)仍是 obj,說(shuō)明應(yīng)該賦予 sayColor() 函數(shù)中的 this 關(guān)鍵字值是 obj。第二個(gè)參數(shù)是由兩個(gè)字符串構(gòu)成的數(shù)組,與 sayColor() 函數(shù)中的參數(shù) sPrefix 和 sSuffix 匹配,最后生成的消息仍是 "The color is blue, a very nice color indeed.",將被顯示出來(lái)。
該方法也用于替換前三行的賦值、調(diào)用和刪除新方法的代碼:
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);
};
}
同樣的,第一個(gè)參數(shù)仍是 this,第二個(gè)參數(shù)是只有一個(gè)值 color 的數(shù)組??梢园?ClassB 的整個(gè) arguments 對(duì)象作為第二個(gè)參數(shù)傳遞給 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);
};
}
當(dāng)然,只有超類中的參數(shù)順序與子類中的參數(shù)順序完全一致時(shí)才可以傳遞參數(shù)對(duì)象。如果不是,就必須創(chuàng)建一個(gè)單獨(dú)的數(shù)組,按照正確的順序放置參數(shù)。此外,還可使用 call() 方法。
我們可以看到這兩個(gè)方法能夠很好的代替原始的對(duì)象冒充,使寫法上變得稍微簡(jiǎn)單。但是這些方法的弊端是子類不能繼承父類在原型鏈上聲明的方法或?qū)傩裕槍?duì)這個(gè)問(wèn)題下一篇文章將會(huì)介紹JavaScript中另一種實(shí)現(xiàn)繼承的方式—原型鏈繼承。
- JavaScript:new 一個(gè)函數(shù)和直接調(diào)用函數(shù)的區(qū)別分析
- JavaScript函數(shù)的4種調(diào)用方法實(shí)例分析
- JavaScript 函數(shù)的定義-調(diào)用、注意事項(xiàng)
- 深入學(xué)習(xí) JavaScript中的函數(shù)調(diào)用
- 淺談js函數(shù)三種定義方式 & 四種調(diào)用方式 & 調(diào)用順序
- javascript函數(shù)的四種調(diào)用模式
- Javascript 函數(shù)的四種調(diào)用模式
- 深入理解JavaScript中的尾調(diào)用(Tail Call)
- javascript使用call調(diào)用微信API
- javaScript call 函數(shù)的用法說(shuō)明
- JavaScript中的apply和call函數(shù)詳解
- JavaScript直接調(diào)用函數(shù)與call調(diào)用的區(qū)別實(shí)例分析
相關(guān)文章
在JavaScript中處理字符串之fontcolor()方法的使用
這篇文章主要介紹了在JavaScript中處理字符串之fontcolor()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06Javascript之BOM(window對(duì)象)詳解
下面小編就為大家?guī)?lái)一篇Javascript之BOM(window對(duì)象)詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05淺談JavaScript中setInterval和setTimeout的使用問(wèn)題
這篇文章主要介紹了淺談JavaScript中setInterval和setTimeout的使用問(wèn)題,作者建議在任務(wù)龐大時(shí)盡量避免使用setInterval,需要的朋友可以參考下2015-08-08window.location.reload 刷新使用分析(去對(duì)話框)
這篇文章主要介紹了window.location.reload 刷新使用分析(去對(duì)話框),需要的朋友可以參考下2015-11-11JS多線程API?webworker應(yīng)用場(chǎng)景有哪些
這篇文章主要介紹了JS多線程API?webworker應(yīng)用場(chǎng)景有哪些,加密數(shù)據(jù),預(yù)取數(shù)據(jù),預(yù)渲染,復(fù)雜數(shù)據(jù)處理場(chǎng)景,預(yù)加載圖片需要的朋友可以參考下2023-02-02addEventListener()第三個(gè)參數(shù)useCapture (Boolean)詳細(xì)解析
true的觸發(fā)順序總是在false之前;如果多個(gè)均為true,則外層的觸發(fā)先于內(nèi)層;如果多個(gè)均為false,則內(nèi)層的觸發(fā)先于外層2013-11-11Javascript基礎(chǔ)知識(shí)(一)核心基礎(chǔ)語(yǔ)法與事件模型
這篇文章主要介紹了Javascript用途及語(yǔ)法,傳統(tǒng)事件及現(xiàn)代事件,是最近這段時(shí)間個(gè)人學(xué)習(xí)javascript的一些心得,分享給大家,有需要的朋友可以參考下2014-09-09