获取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 相关文章推荐
jquery validation插件表单验证的一个例子
Mar 03 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
Jan 21 Javascript
js关于字符长度限制的问题示例探讨
Jan 24 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
Node.js模块加载详解
Aug 16 Javascript
js 求时间差的实现代码
Apr 26 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 Javascript
vue+AI智能机器人回复功能实现
Jul 16 Javascript
谈谈JavaScript中的垃圾回收机制
Sep 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执行速度全攻略(下)
2006/10/09 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
如何打开php的gd2库
2017/02/09 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
解放web程序员的输入验证
2006/10/06 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
浅谈angular2子组件的事件传递(任意组件事件传递)
2018/09/30 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
python机器学习之决策树分类详解
2017/12/20 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python二维码生成识别实例详解
2019/07/16 Python
pygame实现五子棋游戏
2019/10/29 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
Python基于locals返回作用域字典
2020/10/17 Python
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
初一体育教学反思
2014/01/29 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
网页美工求职信范文
2014/04/17 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
酒会开场白大全
2015/06/01 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
python实现网络五子棋
2021/04/11 Python
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS