获取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 相关文章推荐
JS option location 页面跳转实现代码
Dec 27 Javascript
javascript 动态创建表格
Jan 08 Javascript
Easyui form combobox省市区三级联动
Jan 13 Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 Javascript
第一次接触Bootstrap框架
Oct 24 Javascript
JS实现双击内容变为可编辑状态
Mar 03 Javascript
jqueryUI tab标签页代码分享
Oct 09 jQuery
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 Javascript
vue项目引入字体.ttf的方法
Sep 28 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
小程序实现文字循环滚动动画
Jun 14 Javascript
JavaScript阻止事件冒泡的方法
Dec 06 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
用session做客户验证时的注意事项
2006/10/09 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
python实现RSA加密(解密)算法
2016/02/17 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
美国著名手表网站:Timepiece
2017/11/15 全球购物
质量工程师岗位职责
2013/11/16 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
普通话演讲稿
2014/09/03 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
工作检讨书范文
2015/01/23 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python