获取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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
jquery.validate使用攻略 第二部
Jul 01 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
Dec 04 Javascript
js实现飞入星星特效代码
Oct 17 Javascript
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
JavaScript中的lastIndexOf()方法使用详解
Jun 06 Javascript
运用js教你轻松制作html音乐播放器
Apr 17 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
Jun 12 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
Feb 13 Javascript
node.js Promise对象的使用方法实例分析
Dec 26 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 Javascript
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
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 Session存储到Redis的方法
2013/11/04 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP-FPM的配置与优化讲解
2019/03/15 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
采购部岗位职责
2013/11/24 职场文书
室内设计专业个人的自我评价
2013/12/18 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
前处理组长岗位职责
2014/03/01 职场文书
民族精神月活动总结
2014/08/28 职场文书
学雷锋日活动总结
2015/02/06 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python