利用javascript中的call實(shí)現(xiàn)繼承
更新時(shí)間:2007年01月22日 00:00:00 作者:
昨天阿丹傳了一個(gè)javascript中的重載例子給我,感覺(jué)不錯(cuò).雖然到現(xiàn)在還是不太明白.怎么實(shí)現(xiàn)的.但還是貼出來(lái).
實(shí)現(xiàn)setTimeout傳object對(duì)象
看以下代碼實(shí)現(xiàn)向里面的function 傳參數(shù)
<script type="text/javascript">
var _st = window.setTimeout;
window.setTimeout = function(fRef, mDelay) {
if(typeof fRef == 'function'){
var argu = Array.prototype.slice.call(arguments,2);
var f = (function(){ fRef.apply(null, argu); });
return _st(f, mDelay);
}
return _st(fRef,mDelay);
}
function test(x){
alert(x);
}
window.setTimeout(test,1000,'fason');
</script>
call方法JScript參考中的說(shuō)明:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒(méi)有示例
apply方法JScript參考中的說(shuō)明:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。apply([thisObj[,argArray]])
實(shí)際上這兩個(gè)的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數(shù)可以是變量,而apply([thisObj[,argArray]])中的參數(shù)為數(shù)組集合。
今早又看到一篇利用call實(shí)現(xiàn)繼承的例子.呵呵..也一并貼出來(lái).這個(gè)例子比較簡(jiǎn)單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類(lèi)
var self=this; //私有變量,子類(lèi)里不會(huì)繼承!
var var_private="private variable"; //私有變量
this.var_public="public variable"; //公有變量
this.author="xling";
this.test=function(msg){ //公有方法
alert("該方法位于父類(lèi) :" + msg + "\n" + self.author);
}
var test2=function(){ //私有方法,子類(lèi)不能調(diào)用
alert("這個(gè)方法是父類(lèi)的私有方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子類(lèi)
father.call(this);//通過(guò)這一句來(lái)繼承父類(lèi)(father)類(lèi)的可見(jiàn)變量及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實(shí)現(xiàn)多重繼承!爽??!
}
var mySuber=new suber();
mySuber.test("參數(shù)是從子類(lèi)的實(shí)例里傳入的");
//mySuber.test2(); //這一句會(huì)發(fā)生錯(cuò)誤碼,因?yàn)閠est2是父類(lèi)的私有類(lèi)
alert("父類(lèi)的私有變量,子類(lèi)不能讀取:" + mySuber.var_private);
alert("父類(lèi)的公有變量,子類(lèi)可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個(gè)是從孫子級(jí)的實(shí)例里傳入的參數(shù)");
alert("父類(lèi)的私有變量,子類(lèi)不能讀取:" + mySun.var_private);
alert("父類(lèi)的公有變量,子類(lèi)可以讀取" + mySun.var_public);
alert(mySun.email);
</script>
實(shí)現(xiàn)setTimeout傳object對(duì)象
看以下代碼實(shí)現(xiàn)向里面的function 傳參數(shù)
<script type="text/javascript">
var _st = window.setTimeout;
window.setTimeout = function(fRef, mDelay) {
if(typeof fRef == 'function'){
var argu = Array.prototype.slice.call(arguments,2);
var f = (function(){ fRef.apply(null, argu); });
return _st(f, mDelay);
}
return _st(fRef,mDelay);
}
function test(x){
alert(x);
}
window.setTimeout(test,1000,'fason');
</script>
call方法JScript參考中的說(shuō)明:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒(méi)有示例
apply方法JScript參考中的說(shuō)明:應(yīng)用某一對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。apply([thisObj[,argArray]])
實(shí)際上這兩個(gè)的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數(shù)可以是變量,而apply([thisObj[,argArray]])中的參數(shù)為數(shù)組集合。
今早又看到一篇利用call實(shí)現(xiàn)繼承的例子.呵呵..也一并貼出來(lái).這個(gè)例子比較簡(jiǎn)單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類(lèi)
var self=this; //私有變量,子類(lèi)里不會(huì)繼承!
var var_private="private variable"; //私有變量
this.var_public="public variable"; //公有變量
this.author="xling";
this.test=function(msg){ //公有方法
alert("該方法位于父類(lèi) :" + msg + "\n" + self.author);
}
var test2=function(){ //私有方法,子類(lèi)不能調(diào)用
alert("這個(gè)方法是父類(lèi)的私有方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子類(lèi)
father.call(this);//通過(guò)這一句來(lái)繼承父類(lèi)(father)類(lèi)的可見(jiàn)變量及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實(shí)現(xiàn)多重繼承!爽??!
}
var mySuber=new suber();
mySuber.test("參數(shù)是從子類(lèi)的實(shí)例里傳入的");
//mySuber.test2(); //這一句會(huì)發(fā)生錯(cuò)誤碼,因?yàn)閠est2是父類(lèi)的私有類(lèi)
alert("父類(lèi)的私有變量,子類(lèi)不能讀取:" + mySuber.var_private);
alert("父類(lèi)的公有變量,子類(lèi)可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個(gè)是從孫子級(jí)的實(shí)例里傳入的參數(shù)");
alert("父類(lèi)的私有變量,子類(lèi)不能讀取:" + mySun.var_private);
alert("父類(lèi)的公有變量,子類(lèi)可以讀取" + mySun.var_public);
alert(mySun.email);
</script>
您可能感興趣的文章:
- 一個(gè)JavaScript繼承的實(shí)現(xiàn)
- 用JavaScript實(shí)現(xiàn)單繼承和多繼承的簡(jiǎn)單方法
- Javascript 繼承實(shí)現(xiàn)例子
- Javascript 繼承機(jī)制的實(shí)現(xiàn)
- 實(shí)現(xiàn)JavaScript中繼承的三種方式
- javascript 面向?qū)ο?實(shí)現(xiàn)namespace,class,繼承,重載
- js繼承的實(shí)現(xiàn)代碼
- js對(duì)象的構(gòu)造和繼承實(shí)現(xiàn)代碼
- ExtJS4中使用mixins實(shí)現(xiàn)多繼承示例
- 深入理解JavaScript是如何實(shí)現(xiàn)繼承的
- 詳解Javascript繼承的實(shí)現(xiàn)
相關(guān)文章
javascript 實(shí)現(xiàn)頁(yè)面加載進(jìn)度條代碼
javascript 實(shí)現(xiàn)頁(yè)面加載進(jìn)度條代碼,需要的朋友可以參考下。2010-04-04jstl中判斷l(xiāng)ist中是否包含某個(gè)值的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇jstl中判斷l(xiāng)ist中是否包含某個(gè)值的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10js實(shí)現(xiàn)頁(yè)面多個(gè)日期時(shí)間倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)頁(yè)面多個(gè)日期時(shí)間倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06利用javascript實(shí)現(xiàn)的三種圖片放大鏡效果實(shí)例(附源碼)
這篇文章主要介紹了利用javascript實(shí)現(xiàn)的幾種放大鏡效果,很實(shí)用一款漂亮的js圖片放大鏡特效,常見(jiàn)于電商網(wǎng)站上產(chǎn)品頁(yè),用來(lái)放大展示圖片細(xì)節(jié),很有實(shí)用性,推薦下載學(xué)習(xí)研究。文中提供了完整的源碼供大家下載,需要的朋友可以參考借鑒,一起來(lái)看看吧。2017-01-01JS canvas實(shí)現(xiàn)畫(huà)板和簽字板功能
這篇文章主要為大家詳細(xì)介紹了JS canvas實(shí)現(xiàn)畫(huà)板和簽字板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02setTimeout的延時(shí)為0時(shí)多個(gè)瀏覽器的區(qū)別
一直比較迷惑:js的setTimeout到底會(huì)在什么時(shí)候執(zhí)行,如果執(zhí)行了,和主執(zhí)行腳本到底差多長(zhǎng)時(shí)間2012-05-05