獲取JavaScript用戶自定義類的類名稱的代碼
更新時(shí)間:2007年03月08日 00:00:00 作者:
我們知道,雖然JavaScript是基于對(duì)象(object-based)的語(yǔ)言。但是使用其原形(prototype)特性,我們完全可以實(shí)現(xiàn)十分sexy的OO編成框架,這個(gè)可以看看經(jīng)典論壇的文章'基本上實(shí)現(xiàn) javascript 的 OOP (0423版)'。
不過雖然我們實(shí)現(xiàn)了'類'這種概念,可是JavaScript的腳本系統(tǒng)卻仍然是不認(rèn)賬的。我們并沒有辦法使用腳本系統(tǒng)中的typeof方法獲取自定義類的類型,比如'類'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)然我們可以把類名稱"JSClass"使用toString()方法來返回,不過這種依賴手動(dòng)type來保證正確性的方法并不時(shí)很理想。
于是我們從類定義本身去想辦法,由于JavaScript中的對(duì)象(Object)默認(rèn)都實(shí)現(xiàn)了toString()方法,而且函數(shù)對(duì)象(Function)的toString()方法就是返回該函數(shù)的定義本身,這樣我們就可以通過處理類定義來獲取類名了。
我們通過對(duì)象實(shí)例的constructor屬性,可以獲取其構(gòu)造函數(shù)的定義,而構(gòu)造函數(shù)的名字也就是JavaScript用戶自定義類的類名稱。對(duì)于上面的例子,執(zhí)行 var strFun = jaclass.constructor.toString(),strFun就是構(gòu)造函數(shù)的原始語(yǔ)句定義(和上面語(yǔ)句塊內(nèi)容相同)的字符串。我們從strFun中取出"函數(shù)名"(類名)就行了,可是這里需要注意。Function類的實(shí)例執(zhí)行toString()時(shí)并不會(huì)格式化代碼,比如我們把JSClass的構(gòu)造函數(shù)寫成如下格式:
function
JSClass
(
)
{
this.Attribute1 = null;
this.Attribute2 = null;
// ...
}
執(zhí)行toString()后的strFun里代碼也是這個(gè)樣子。
所以獲取類名還需要特別的小心,方法__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是類實(shí)例,而JSClass返回類型卻是Function哦;第二個(gè)是如果是系統(tǒng)類型,使用typeof得到的類型都是小寫的,比如number、array或objece啥的,而使用__typeof__獲得的類型名稱是和其類型名匹配的,首字母都大寫。
不過雖然我們實(shí)現(xiàn)了'類'這種概念,可是JavaScript的腳本系統(tǒng)卻仍然是不認(rèn)賬的。我們并沒有辦法使用腳本系統(tǒng)中的typeof方法獲取自定義類的類型,比如'類'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)然我們可以把類名稱"JSClass"使用toString()方法來返回,不過這種依賴手動(dòng)type來保證正確性的方法并不時(shí)很理想。
于是我們從類定義本身去想辦法,由于JavaScript中的對(duì)象(Object)默認(rèn)都實(shí)現(xiàn)了toString()方法,而且函數(shù)對(duì)象(Function)的toString()方法就是返回該函數(shù)的定義本身,這樣我們就可以通過處理類定義來獲取類名了。
我們通過對(duì)象實(shí)例的constructor屬性,可以獲取其構(gòu)造函數(shù)的定義,而構(gòu)造函數(shù)的名字也就是JavaScript用戶自定義類的類名稱。對(duì)于上面的例子,執(zhí)行 var strFun = jaclass.constructor.toString(),strFun就是構(gòu)造函數(shù)的原始語(yǔ)句定義(和上面語(yǔ)句塊內(nèi)容相同)的字符串。我們從strFun中取出"函數(shù)名"(類名)就行了,可是這里需要注意。Function類的實(shí)例執(zhí)行toString()時(shí)并不會(huì)格式化代碼,比如我們把JSClass的構(gòu)造函數(shù)寫成如下格式:
function
JSClass
(
)
{
this.Attribute1 = null;
this.Attribute2 = null;
// ...
}
執(zhí)行toString()后的strFun里代碼也是這個(gè)樣子。
所以獲取類名還需要特別的小心,方法__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是類實(shí)例,而JSClass返回類型卻是Function哦;第二個(gè)是如果是系統(tǒng)類型,使用typeof得到的類型都是小寫的,比如number、array或objece啥的,而使用__typeof__獲得的類型名稱是和其類型名匹配的,首字母都大寫。
相關(guān)文章
Javascript中使用A標(biāo)簽獲取當(dāng)前目錄的絕對(duì)路徑方法
這篇文章主要介紹了Javascript中使用A標(biāo)簽獲取當(dāng)前目錄的絕對(duì)路徑方法,本文講解的方法比較特別,需要的朋友可以參考下2015-03-03js代碼實(shí)現(xiàn)的加入收藏效果并兼容主流瀏覽器
這篇文章主要介紹了js代碼實(shí)現(xiàn)的加入收藏效果并兼容主流瀏覽器,需要的朋友可以參考下2014-06-06淺談layer的Icon樣式以及一些常用的layer窗口使用方法
今天小編就為大家分享一篇淺談layer的Icon樣式以及一些常用的layer窗口使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS中confirm,alert,prompt函數(shù)使用區(qū)別分析
JS中confirm,alert,prompt函數(shù)使用區(qū)別分析,需要的朋友可以參考下。2010-04-04微信小程序五子棋游戲的棋盤,重置,對(duì)弈實(shí)現(xiàn)方法【附demo源碼下載】
這篇文章主要介紹了微信小程序五子棋游戲,可實(shí)現(xiàn)五子棋的棋盤繪制,重置,對(duì)弈判定等功能實(shí)現(xiàn),并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2019-02-02JavaScript實(shí)現(xiàn)一鍵復(fù)制文本功能的示例代碼
這篇文章主要為大家介紹兩種javascript實(shí)現(xiàn)文本復(fù)制(將文本寫入剪貼板)的方法,文中的示例代碼講解詳細(xì),大家可以根據(jù)需求特點(diǎn)選用2023-03-03淺談Javascript中的函數(shù)、this以及原型
下面小編就為大家?guī)硪黄獪\談Javascript中的函數(shù)、this以及原型。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10