利用javascript中的call實(shí)現(xiàn)繼承
更新時間:2007年01月22日 00:00:00 作者:
昨天阿丹傳了一個javascript中的重載例子給我,感覺不錯.雖然到現(xiàn)在還是不太明白.怎么實(shí)現(xiàn)的.但還是貼出來.
實(shí)現(xiàn)setTimeout傳object對象
看以下代碼實(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)用一個對象的一個方法,以另一個對象替換當(dāng)前對象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有示例
apply方法JScript參考中的說明:應(yīng)用某一對象的一個方法,用另一個對象替換當(dāng)前對象。apply([thisObj[,argArray]])
實(shí)際上這兩個的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數(shù)可以是變量,而apply([thisObj[,argArray]])中的參數(shù)為數(shù)組集合。
今早又看到一篇利用call實(shí)現(xiàn)繼承的例子.呵呵..也一并貼出來.這個例子比較簡單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類
var self=this; //私有變量,子類里不會繼承!
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("這個方法是父類的私有方法");
}
}
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(); //這一句會發(fā)生錯誤碼,因為test2是父類的私有類
alert("父類的私有變量,子類不能讀取:" + mySuber.var_private);
alert("父類的公有變量,子類可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個是從孫子級的實(shí)例里傳入的參數(shù)");
alert("父類的私有變量,子類不能讀取:" + mySun.var_private);
alert("父類的公有變量,子類可以讀取" + mySun.var_public);
alert(mySun.email);
</script>
實(shí)現(xiàn)setTimeout傳object對象
看以下代碼實(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)用一個對象的一個方法,以另一個對象替換當(dāng)前對象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有示例
apply方法JScript參考中的說明:應(yīng)用某一對象的一個方法,用另一個對象替換當(dāng)前對象。apply([thisObj[,argArray]])
實(shí)際上這兩個的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數(shù)可以是變量,而apply([thisObj[,argArray]])中的參數(shù)為數(shù)組集合。
今早又看到一篇利用call實(shí)現(xiàn)繼承的例子.呵呵..也一并貼出來.這個例子比較簡單.就算是由淺入深吧
<script language="javascript" type="text/javascript">
function father(){//父類
var self=this; //私有變量,子類里不會繼承!
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("這個方法是父類的私有方法");
}
}
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(); //這一句會發(fā)生錯誤碼,因為test2是父類的私有類
alert("父類的私有變量,子類不能讀取:" + mySuber.var_private);
alert("父類的公有變量,子類可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個是從孫子級的實(shí)例里傳入的參數(shù)");
alert("父類的私有變量,子類不能讀取:" + mySun.var_private);
alert("父類的公有變量,子類可以讀取" + mySun.var_public);
alert(mySun.email);
</script>
您可能感興趣的文章:
- 一個JavaScript繼承的實(shí)現(xiàn)
- 用JavaScript實(shí)現(xià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對象的構(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時的一個語法糖,async/await為了讓我們書寫代碼時更加流暢,增強(qiáng)了代碼的可讀性,下面這篇文章主要給大家介紹了關(guān)于ES6中async函數(shù)與await表達(dá)式的基本用法,需要的朋友可以參考下2022-07-07
微信小程序button標(biāo)簽open-type屬性原理解析
這篇文章主要介紹了微信小程序button標(biāo)簽open-type屬性原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下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)算符基本功能、用法及操作注意事項,需要的朋友可以參考下2020-05-05

