获取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 相关文章推荐
JavaScript页面刷新与弹出窗口问题的解决方法
Mar 02 Javascript
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
Dec 02 Javascript
javascript中scrollTop详解
Apr 13 Javascript
jQuery的end()方法使用详解
Jul 15 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
老生常谈javascript变量的命名规范和注释
Sep 29 Javascript
详解webpack+es6+angular1.x项目构建
May 02 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 Javascript
VuePress 静态网站生成方法步骤
Feb 14 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中的ini配置原理详解
2014/10/14 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
利用python进行文件操作
2020/12/04 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
退伍老兵事迹材料
2014/01/31 职场文书
英语教师岗位职责
2014/03/16 职场文书
大学生心理活动总结
2014/07/04 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
亮剑观后感
2015/06/05 职场文书
Mysql Show Profile
2021/04/05 MySQL
详解Python requests模块
2021/06/21 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python