获取JavaScript用户自定义类的类名称的代码


Posted in Javascript onMarch 08, 2007

我们知道,虽然JavaScript是基于对象(object-based)的语言。但是使用其原形(prototype)特性,我们完全可以实现十分sexy的OO编成框架,这个可以看看经典论坛的文章'基本上实现 javascript 的 OOP (0423版)'。

    不过虽然我们实现了'类'这种概念,可是JavaScript的脚本系统却仍然是不认账的。我们并没有办法使用脚本系统中的typeof方法获取自定义类的类型,比如'类'JSClass定义如下:

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

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

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

    this.toString = function()
    {
       return '[class JSClass]';
    };
 }
    我们生成一个它的实例:var jsclass = new JSClass();
    可是如果使用alert(typeof(jsclass)),我们只能得到'object'。而是用alert(jsclass),我们却得到'[class JSClass]',这是对象实例默认调用toString()方法的结果。当然我们可以把类名称"JSClass"使用toString()方法来返回,不过这种依赖手动type来保证正确性的方法并不时很理想。

    于是我们从类定义本身去想办法,由于JavaScript中的对象(Object)默认都实现了toString()方法,而且函数对象(Function)的toString()方法就是返回该函数的定义本身,这样我们就可以通过处理类定义来获取类名了。

    我们通过对象实例的constructor属性,可以获取其构造函数的定义,而构造函数的名字也就是JavaScript用户自定义类的类名称。对于上面的例子,执行 var strFun = jaclass.constructor.toString(),strFun就是构造函数的原始语句定义(和上面语句块内容相同)的字符串。我们从strFun中取出"函数名"(类名)就行了,可是这里需要注意。Function类的实例执行toString()时并不会格式化代码,比如我们把JSClass的构造函数写成如下格式:

function
   JSClass
   (
   )
{
   this.Attribute1 = null;
   this.Attribute2 = null;
   // ...
}
    执行toString()后的strFun里代码也是这个样子。

    所以获取类名还需要特别的小心,方法__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>
    结果分别为:"JSClass", "Function", "Number", "Array"和"Object"。

    这里需要注意两个地方,一是:jsclass和JSClass的区别,jsclass是类实例,而JSClass返回类型却是Function哦;第二个是如果是系统类型,使用typeof得到的类型都是小写的,比如number、array或objece啥的,而使用__typeof__获得的类型名称是和其类型名匹配的,首字母都大写。

Javascript 相关文章推荐
getComputedStyle与currentStyle获取样式(style/class)
Mar 19 Javascript
js图片自动轮播代码分享(js图片轮播)
May 06 Javascript
JavaScript+html5 canvas绘制的小人效果
Jan 27 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
Apr 11 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
Feb 20 Javascript
详解VueJs异步动态加载块
Mar 09 Javascript
微信小程序教程系列之新建页面(4)
Apr 17 Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 Javascript
浅析Vue实例以及生命周期
Aug 14 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
微信小程序封装多张图片上传api代码实例
Dec 30 Javascript
JavaScript代码异常监控实现过程详解
Feb 17 Javascript
JScript内置对象Array中元素的删除方法
Mar 08 #Javascript
在JavaScript中遭遇级联表达式陷阱
Mar 08 #Javascript
原型方法的不同写法居然会影响调试的解决方法
Mar 08 #Javascript
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
Mar 08 #Javascript
JS类库Bindows1.3中的内存释放方式分析
Mar 08 #Javascript
使用IE的地址栏来辅助调试Web页脚本
Mar 08 #Javascript
JScript中的undefined和&quot;undefined&quot;的区别
Mar 08 #Javascript
You might like
PHP array_multisort()函数的使用札记
2011/07/03 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
JavaScript 学习 - 提高篇
2007/02/02 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
JS实现的添加弹出层并完成锁屏操作示例
2017/04/07 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python 文件处理注意事项总结
2017/04/10 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python实现FLV视频拼接功能
2020/01/21 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
python实现无边框进度条的实例代码
2020/12/30 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
北京大学自荐信范文
2014/01/28 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
出国英文推荐信
2014/05/10 职场文书
体育口号大全
2014/06/18 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
讲座新闻稿
2015/07/18 职场文书
ICOM R71E和R72E图文对比解说
2022/04/07 无线电