最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 構(gòu)造函數(shù)強制調(diào)用經(jīng)驗總結(jié)

 更新時間:2012年12月02日 10:10:06   作者:  
本文將介紹javascript構(gòu)造函數(shù)調(diào)用方面的案例應(yīng)用,需要了解的朋友可以參考下
興致勃勃地定義了下面這么個構(gòu)造函數(shù):
復(fù)制代碼 代碼如下:

var Coder = function( nick ){
this.nick = nick;
};

定義構(gòu)造函數(shù)結(jié)束后呢?沒錯,趕緊實例化:
var coder = Coder( 'casper' );
這個coder兄弟叫什么名字?趕緊打印下:
復(fù)制代碼 代碼如下:

console.log( coder.nick ); //undefined
= =b 竟然是undefined??!再回過頭看看實例化的那個語句,不難發(fā)現(xiàn)問題出在哪里:少了個new
var coder = Coder( 'casper' ); //當(dāng)作普通的函數(shù)來調(diào)用,故內(nèi)部的this指針其實指向window對象
console.log( window.nick); //輸出:casper
var coder = new Coder( 'casper' ); //加上new,一切皆不同,this正確地指向了當(dāng)前創(chuàng)建的實例
console.log( coder.nick ); //輸出:casper

關(guān)于this指針的指向問題不是本文討論的內(nèi)容,可以參考下犀牛書相關(guān)章節(jié)
這樣的錯誤貌似挺低級的,但出現(xiàn)的概率挺高的,腫么去避免或減少這種情況的發(fā)生呢?
可以在內(nèi)部實現(xiàn)里面動下手腳:
復(fù)制代碼 代碼如下:

var Coder = function( nick ){
if( !(this instanceof Coder) ){
return new Coder( nick );
}
this.nick = nick;
};

其實很簡單,實例化的時候,內(nèi)部判斷下,當(dāng)前this指向的對象的類型即可,如果非當(dāng)前構(gòu)造函數(shù)的類型,強制重新調(diào)用一遍構(gòu)造函數(shù)。
突然覺得Coder這名字不夠洋氣?想用Hacker,好吧,我改。。。數(shù)了下,一共有三處要改,這不科學(xué),有沒有辦法只把構(gòu)造函數(shù)的名字改了就行?
當(dāng)然有:
復(fù)制代碼 代碼如下:

var Coder = function( nick ){
if( !(this instanceof arguments.callee) ){
return new arguments.callee( nick );
}
this.nick = nick;
};
 
tips:據(jù)說在ES 5的嚴(yán)格模式下面arguments.callee會被禁用,不過僅當(dāng)ES 5普及同時你指定了要使用嚴(yán)格模式,否則還是可以用的發(fā)散下思維:在JQ里面包打天下所向披靡的$,大家都知道它會返回一個jquery對象,如下:
var jObject = $('#node_id');
有沒有發(fā)現(xiàn),這里同樣沒有new!應(yīng)該猜到怎么回事了吧。原理是差不多的,不過里面的實現(xiàn)要復(fù)雜得多,有空再把JQ里面的實現(xiàn)拔下寫下總結(jié)

相關(guān)文章

最新評論

乌拉特中旗| 莒南县| 偃师市| 仙桃市| 德州市| 治县。| 集安市| 蛟河市| 茂名市| 凉山| 舞钢市| 汉中市| 泰宁县| 潼关县| 云霄县| 岑溪市| 云南省| 固原市| 诸暨市| 梧州市| 长阳| 调兵山市| 团风县| 盐亭县| 峨眉山市| 论坛| 武宁县| 阳新县| 南丹县| 东安县| 茶陵县| 大冶市| 兴国县| 清丰县| 烟台市| 泸溪县| 信阳市| 清流县| 甘南县| 漾濞| 易门县|