利用javascript中的call實(shí)現(xiàn)繼承
更新時(shí)間:2007年01月22日 00:00:00 作者:
昨天阿丹傳了一個(gè)javascript中的重載例子給我,感覺不錯(cuò).雖然到現(xiàn)在還是不太明白.怎么實(shí)現(xiàn)的.但還是貼出來.
實(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參考中的說明:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有示例
apply方法JScript參考中的說明:應(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)繼承的例子.呵呵..也一并貼出來.這個(gè)例子比較簡(jiǎn)單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類
var self=this; //私有變量,子類里不會(huì)繼承!
var var_private="private variable"; //私有變量
this.var_public="public variable"; //公有變量
this.author="xling";
this.test=function(msg){ //公有方法
alert("該方法位于父類 :" + msg + "\n" + self.author);
}
var test2=function(){ //私有方法,子類不能調(diào)用
alert("這個(gè)方法是父類的私有方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子類
father.call(this);//通過這一句來繼承父類(father)類的可見變量及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實(shí)現(xiàn)多重繼承!爽??!
}
var mySuber=new suber();
mySuber.test("參數(shù)是從子類的實(shí)例里傳入的");
//mySuber.test2(); //這一句會(huì)發(fā)生錯(cuò)誤碼,因?yàn)閠est2是父類的私有類
alert("父類的私有變量,子類不能讀取:" + mySuber.var_private);
alert("父類的公有變量,子類可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個(gè)是從孫子級(jí)的實(shí)例里傳入的參數(shù)");
alert("父類的私有變量,子類不能讀取:" + mySun.var_private);
alert("父類的公有變量,子類可以讀取" + 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參考中的說明:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有示例
apply方法JScript參考中的說明:應(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)繼承的例子.呵呵..也一并貼出來.這個(gè)例子比較簡(jiǎn)單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類
var self=this; //私有變量,子類里不會(huì)繼承!
var var_private="private variable"; //私有變量
this.var_public="public variable"; //公有變量
this.author="xling";
this.test=function(msg){ //公有方法
alert("該方法位于父類 :" + msg + "\n" + self.author);
}
var test2=function(){ //私有方法,子類不能調(diào)用
alert("這個(gè)方法是父類的私有方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子類
father.call(this);//通過這一句來繼承父類(father)類的可見變量及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實(shí)現(xiàn)多重繼承!爽??!
}
var mySuber=new suber();
mySuber.test("參數(shù)是從子類的實(shí)例里傳入的");
//mySuber.test2(); //這一句會(huì)發(fā)生錯(cuò)誤碼,因?yàn)閠est2是父類的私有類
alert("父類的私有變量,子類不能讀取:" + mySuber.var_private);
alert("父類的公有變量,子類可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個(gè)是從孫子級(jí)的實(shí)例里傳入的參數(shù)");
alert("父類的私有變量,子類不能讀取:" + mySun.var_private);
alert("父類的公有變量,子類可以讀取" + 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)文章
ES6中async函數(shù)與await表達(dá)式的基本用法舉例
async和await是我們進(jìn)行Promise時(shí)的一個(gè)語法糖,async/await為了讓我們書寫代碼時(shí)更加流暢,增強(qiáng)了代碼的可讀性,下面這篇文章主要給大家介紹了關(guān)于ES6中async函數(shù)與await表達(dá)式的基本用法,需要的朋友可以參考下2022-07-07
js 數(shù)值項(xiàng)目的格式化函數(shù)代碼
數(shù)值項(xiàng)目的格式化函數(shù)代碼,需要的朋友可以參考下。2010-05-05
微信小程序button標(biāo)簽open-type屬性原理解析
這篇文章主要介紹了微信小程序button標(biāo)簽open-type屬性原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符用法實(shí)例分析
這篇文章主要介紹了ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符用法,結(jié)合實(shí)例形式分析了ES6擴(kuò)展運(yùn)算符和rest運(yùn)算符基本功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05

