不過(guò)雖 " /> 亚洲人成网站999久久久综合,精精国产xxx在线视频app,av中文字幕在线观看第一页

色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

獲取JavaScript用戶(hù)自定義類(lèi)的類(lèi)名稱(chēng)的代碼

我們知道,雖然JavaScript是基于對(duì)象(object-based)的語(yǔ)言。但是使用其原形(prototype)特性,我們完全可以實(shí)現(xiàn)十分sexy的OO編成框架,這個(gè)可以看看經(jīng)典論壇的文章'基本上實(shí)現(xiàn) Javascript 的 OOP (0423版)'。

    不過(guò)雖然我們實(shí)現(xiàn)了'類(lèi)'這種概念,可是JavaScript的腳本系統(tǒng)卻仍然是不認(rèn)賬的。我們并沒(méi)有辦法使用腳本系統(tǒng)中的typeof方法獲取自定義類(lèi)的類(lèi)型,比如'類(lèi)'JSClass定義如下:

 function JSClass()
 {
    this.Attribute1 = null;
    this.Attribute2 = null;

    this.Method1 = function()
    {
       // ...
    };

    this.Method2 = function()
    {
       // ...
    };

    this.toString = function()
    {
       return '[class JSClass]';
    };
 }
    我們生成一個(gè)它的實(shí)例:var jsclass = new JSClass();
    可是如果使用alert(typeof(jsclass)),我們只能得到'object'。而是用alert(jsclass),我們卻得到'[class JSClass]',這是對(duì)象實(shí)例默認(rèn)調(diào)用toString()方法的結(jié)果。當(dāng)然我們可以把類(lèi)名稱(chēng)"JSClass"使用toString()方法來(lái)返回,不過(guò)這種依賴(lài)手動(dòng)type來(lái)保證正確性的方法并不時(shí)很理想。

    于是我們從類(lèi)定義本身去想辦法,由于JavaScript中的對(duì)象(Object)默認(rèn)都實(shí)現(xiàn)了toString()方法,而且函數(shù)對(duì)象(Function)的toString()方法就是返回該函數(shù)的定義本身,這樣我們就可以通過(guò)處理類(lèi)定義來(lái)獲取類(lèi)名了。

    我們通過(guò)對(duì)象實(shí)例的constructor屬性,可以獲取其構(gòu)造函數(shù)的定義,而構(gòu)造函數(shù)的名字也就是JavaScript用戶(hù)自定義類(lèi)的類(lèi)名稱(chēng)。對(duì)于上面的例子,執(zhí)行 var strFun = jaclass.constructor.toString(),strFun就是構(gòu)造函數(shù)的原始語(yǔ)句定義(和上面語(yǔ)句塊內(nèi)容相同)的字符串。我們從strFun中取出"函數(shù)名"(類(lèi)名)就行了,可是這里需要注意。Function類(lèi)的實(shí)例執(zhí)行toString()時(shí)并不會(huì)格式化代碼,比如我們把JSClass的構(gòu)造函數(shù)寫(xiě)成如下格式:

function
   JSClass
   (
   )
{
   this.Attribute1 = null;
   this.Attribute2 = null;
   // ...
}
    執(zhí)行toString()后的strFun里代碼也是這個(gè)樣子。

    所以獲取類(lèi)名還需要特別的小心,方法__typeof__的代碼如下:

 function __typeof__(objClass)
 {
     if ( objClass && objClass.constructor )
     {
         var strFun = objClass.constructor.toString();
         var className = strFun.substr(0, strFun.indexOf('('));
         className = className.replace('function', '');
         return className.replace(/(^/s*)|(/s*$)/ig, '');  
     }
     return typeof(objClass);
 }

    示例:

<script language="Javascript">
alert(__typeof__(jsclass));
alert(__typeof__(JSClass));
alert(__typeof__(1));
alert(__typeof__([]));
alert(__typeof__({}));
</script>
    結(jié)果分別為:"JSClass", "Function", "Number", "Array"和"Object"。

    這里需要注意兩個(gè)地方,一是:jsclass和JSClass的區(qū)別,jsclass是類(lèi)實(shí)例,而JSClass返回類(lèi)型卻是Function哦;第二個(gè)是如果是系統(tǒng)類(lèi)型,使用typeof得到的類(lèi)型都是小寫(xiě)的,比如number、array或objece啥的,而使用__typeof__獲得的類(lèi)型名稱(chēng)是和其類(lèi)型名匹配的,首字母都大寫(xiě)。

JavaScript技術(shù)獲取JavaScript用戶(hù)自定義類(lèi)的類(lèi)名稱(chēng)的代碼,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 巩义市| 枣阳市| 增城市| 盖州市| 南汇区| 铁岭县| 巴彦县| 辉县市| 新巴尔虎左旗| 天镇县| 宁都县| 营口市| 裕民县| 临汾市| 瑞丽市| 龙井市| 房产| 崇州市| 石林| 邹平县| 阳江市| 秦安县| 刚察县| 万年县| 紫阳县| 屏边| 南岸区| 临江市| 东乌珠穆沁旗| 和静县| 萨迦县| 南昌县| 丹东市| 安西县| 木兰县| 张家港市| 深水埗区| 兰溪市| 清丰县| 徐闻县| 和田市|