Javascript中call的兩種用法實(shí)例
用法一(常見用法):
表現(xiàn)形式為:一個(gè)對(duì)象.方法.call(另一個(gè)對(duì)象),意義是用另一個(gè)對(duì)象代替當(dāng)前對(duì)象,執(zhí)行當(dāng)前對(duì)象的方法。先看示例:
function Class1(){
this.name = "class1";
this.showName = function(){
alert(this.name);
}
}
function Class2(){
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showName.call(c2);
c2.showName(); //不能執(zhí)行
我們先分別定義了兩個(gè)function,分別是Class1和Class2,它們的主要區(qū)別是Class2比Class1多了一個(gè)showName()方法。接著定義了與Class1、Class2對(duì)應(yīng)的對(duì)象c1和c2,這時(shí)候我們清醒的知道,c1有showName()方法而c2沒有。但是奇跡出現(xiàn)了,當(dāng)我們執(zhí)行 c1.shoName.call(c2) 時(shí),會(huì)彈出c2的name值,即"class2"。其實(shí),我們執(zhí)行的任然是c1的方法,只不過臨時(shí)起意地把對(duì)象c2偷換成對(duì)象c1,執(zhí)行完畢后,它們?nèi)稳皇嵌x時(shí)的樣子,c2并沒有因此多了些什么方法。為了檢測(cè)c2有沒有多了方法,示例加了行 c2.showNmae(); 它是不能被執(zhí)行的,瀏覽器會(huì)報(bào)出 Object #<Class2> has no method 'showName' 的錯(cuò)誤。
為什么要這么做?前面說了,這是一種臨時(shí)起意的使用方法,我們就是利用其高效的編程而已。但這并不是沒有限制的,假設(shè)用c1和c2表示被替換的對(duì)象和替換對(duì)象,用fun1表示c1固有的方法。1、當(dāng)fun1不需要參數(shù),且不用到父函數(shù)中的任意局部變量時(shí),其實(shí)c1.fun1.call(c2) 和 c1.fun1() 沒什么區(qū)別;2、當(dāng)fun1不需要參數(shù)但是用到父函數(shù)中的變量,那么就要求生成c1和c2的function有相同名稱的那些個(gè)被fun1使用的變量;3、當(dāng)fun1需要參數(shù)時(shí),形式要改寫成c1.fun1.call(c2, 參數(shù)1, 參數(shù)2, ...參數(shù)n),這個(gè)時(shí)候生成c1的function中的變量名就不必和生成c2的function的變量名同名了,只需對(duì)應(yīng)即可。其實(shí),我們?cè)谟玫絚all的這種用法時(shí),c2和c1往往在結(jié)構(gòu)和功能上已經(jīng)有很大的相似性了,所以上述三點(diǎn)很容易避免。
用法二:
在function的定義過程中使用,表現(xiàn)形式:另一個(gè)已存在函數(shù).call(this),它可以將另一個(gè)已存在函數(shù)的變量、方法統(tǒng)統(tǒng)克隆到自己的函數(shù)中,實(shí)現(xiàn)一種類似于繼承的功能。看個(gè)例子:
function Animal(name){
this.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")
相關(guān)文章
JavaScript獲取當(dāng)前頁面上的指定對(duì)象示例代碼
這篇文章主要介紹了JavaScript獲取當(dāng)前頁面上指定對(duì)象的方法,需要的朋友可以參考下2014-02-02jsonp跨域獲取數(shù)據(jù)的基礎(chǔ)教程
這篇文章主要給大家介紹了關(guān)于jsonp跨域獲取數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07利用JavaScript實(shí)現(xiàn)3D可旋轉(zhuǎn)粒子矩陣效果
dat.gui.js是一個(gè)一個(gè)輕量級(jí)的圖形用戶界面庫(kù),或者說GUI組件,只有幾十KB,可以用于創(chuàng)建操作控制三維場(chǎng)景的菜單欄等。本文將利用dat.gui.min.js實(shí)現(xiàn)3D可旋轉(zhuǎn)粒子矩陣效果,感興趣的可以了解一下2022-06-06使用validate.js實(shí)現(xiàn)表單數(shù)據(jù)提交前的驗(yàn)證方法
這篇文章主要介紹了使用validate.js實(shí)現(xiàn)表單數(shù)據(jù)提交前的驗(yàn)證方法,文中給大家提供了完整代碼,需要的朋友可以參考下2018-09-09原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫效果的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄鷍s實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫效果的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08javascript實(shí)現(xiàn)根據(jù)函數(shù)名稱字符串動(dòng)態(tài)執(zhí)行函數(shù)的方法示例
這篇文章主要介紹了javascript實(shí)現(xiàn)根據(jù)函數(shù)名稱字符串動(dòng)態(tài)執(zhí)行函數(shù)的方法,結(jié)合實(shí)例形式分析了JS函數(shù)名的判斷及函數(shù)動(dòng)態(tài)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2016-12-12js實(shí)時(shí)監(jiān)聽文本框狀態(tài)的方法
js實(shí)時(shí)監(jiān)聽文本框狀態(tài)的方法,這里的方法兼容性不是很好,建議參考腳本之家以前的文章。2011-04-04