昨天阿丹傳了一個javascript中的重載例子給我,感覺不錯.雖然到現在還是不太明白.怎麼實現的.但還是貼出來.
實現setTimeout傳object對象
看以下代碼實現向裡面的function 傳參數
<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參考中的說明:調用一個對象的一個方法,以另一個對象替換當前對象。call([thisObj[,arg1[, arg2[, [,.argN]]]]]),但是沒有樣本
apply方法JScript參考中的說明:應用某一對象的一個方法,用另一個對象替換當前對象。apply([thisObj[,argArray]])
實際上這兩個的作用幾乎是相同的,要注意的地方是call(thisObj[,arg1[, arg2[,)中的arg參數可以是變數,而apply([thisObj[,argArray]])中的參數為數組集合。
今早又看到一篇利用call實現繼承的例子.呵呵..也一併貼出來.這個例子比較簡單.就算是由淺入深吧
<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(){ //私人方法,子類不能調用
alert("這個方法是父類的私人方法");
}
}
function father2(){
this.email="xlingFairy#hotmail.com";
}
function suber(){//子類
father.call(this);//通過這一句來繼承父類(father)類的可見變數及方法(this)
}
function sun(){
suber.call(this);
father2.call(this);//和上面的一句放在一起,實現多重繼承!爽啊!
}
var mySuber=new suber();
mySuber.test("參數是從子類的執行個體裡傳入的");
//mySuber.test2(); //這一句會發生錯誤碼,因為test2是父類的私人類
alert("父類的私人變數,子類不能讀取:" + mySuber.var_private);
alert("父類的公有變數,子類可以讀取" + mySuber.var_public);
var mySun=new sun();
mySun.test("這個是從孫子級的執行個體裡傳入的參數");
alert("父類的私人變數,子類不能讀取:" + mySun.var_private);
alert("父類的公有變數,子類可以讀取" + mySun.var_public);
alert(mySun.email);
</script>