获取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 改变CSS样式基础代码
Feb 11 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
js实时获取系统当前时间实例代码
Jun 28 Javascript
Js+Jq获取URL参数的集中方法示例代码
May 20 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
jQuery Tree Multiselect使用详解
May 02 jQuery
详解react-router4 异步加载路由两种方法
Sep 12 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
koa-router源码学习小结
Sep 07 Javascript
vue2中引用及使用 better-scroll的方法详解
Nov 15 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
vue指令做滚动加载和监听等
May 26 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/03 咖啡文化
php UTF8 文件的签名问题
2009/10/30 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
javascript数组随机排序实例分析
2015/07/22 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python重新加载模块的实现方法
2018/10/16 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
应届毕业生求职信
2013/11/30 职场文书
会议活动邀请函
2014/01/27 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
单位绩效考核方案
2014/05/11 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
工商管理自荐书
2014/07/06 职场文书
社会实践的活动方案
2014/08/22 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
初中语文教学研修日志
2015/11/13 职场文书