获取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来实现动画导航效果的代码
Dec 16 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
Sep 17 Javascript
ajax上传时参数提交不更新等相关问题
Dec 11 Javascript
javascript代码运行不出来执行错误的可能情况整理
Oct 18 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
JavaScript编写推箱子游戏
Jul 07 Javascript
JS控制表单提交的方法
Jul 09 Javascript
jquery实现的点击翻书效果代码
Nov 04 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
JS+H5 Canvas实现时钟效果
Jul 20 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
JS 常用校验函数
2009/03/26 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
Python基础知识_浅谈用户交互
2017/05/31 Python
Python实现简单http服务器
2018/04/12 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
python调用摄像头的示例代码
2020/09/28 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
临床医师专业个人自我评价范文
2013/11/07 职场文书
企业安全标语
2014/06/07 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
Django中session进行权限管理的使用
2021/07/09 Python