获取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 相关文章推荐
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
Dec 27 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
常见的jQuery选择器汇总
Nov 24 Javascript
JS上传组件FileUpload自定义模板的使用方法
May 10 Javascript
jQuery中$.each()函数的用法引申实例
May 12 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
Jun 24 Javascript
Three.js学习之正交投影照相机
Aug 01 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
Sep 04 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
JS数据类型判断的几种常用方法
Jul 07 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP个人网站架设连环讲(一)
2006/10/09 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
BootStrap中
2016/12/10 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
原生js实现购物车功能
2020/09/23 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python绘制热力图示例
2019/09/27 Python
Python如何发送与接收大型数组
2020/08/07 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
旅游市场营销方案
2014/03/09 职场文书
中专生自荐信
2014/06/25 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
公司年底活动方案
2014/08/17 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript