获取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 相关文章推荐
event.X和event.clientX的区别分析
Oct 06 Javascript
Javascript writable特性介绍
Feb 27 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 Javascript
js实现楼层导航功能
Feb 23 Javascript
JavaScript实现跟随滚动缓冲运动广告框
Jul 15 Javascript
深入理解ES6的迭代器与生成器
Aug 19 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
Oct 24 Javascript
webstorm中vue语法的支持详解
May 09 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
Nov 12 Javascript
Postman动态获取返回值过程详解
Jun 30 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 数组基础知识小结
2010/08/20 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
php新建文件的方法实例
2019/09/26 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
Python绘制热力图示例
2019/09/27 Python
python自动生成model文件过程详解
2019/11/02 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
python字典的值可以修改吗
2020/06/29 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
资料员岗位职责
2013/11/17 职场文书
职工运动会邀请函
2014/02/02 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
校长寄语大全
2014/04/09 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
保研推荐信格式
2015/03/25 职场文书
篮球赛新闻稿
2015/07/17 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
解除租赁合同协议书
2016/03/21 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python