获取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 隐藏/显示指定的区域附HTML元素【legend】用法
Mar 05 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
Oct 07 Javascript
javascript 系统文件夹文件操作及参数介绍
Jan 08 Javascript
基于Vuejs实现购物车功能
Aug 02 Javascript
JS实现浏览器打印、打印预览示例
Feb 28 Javascript
javascript中json对象json数组json字符串互转及取值方法
Apr 19 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
Vue进度条progressbar组件功能
Apr 17 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
Aug 24 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
echarts实现词云自定义形状的示例代码
Feb 20 Javascript
JavaScript闭包原理与用法学习笔记
May 29 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
PHP邮件专题
2006/10/09 PHP
PHP操作数组相关函数
2011/02/03 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PDO::inTransaction讲解
2019/01/28 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
js使用心得分享
2015/01/13 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
linux面试相关问题
2013/04/28 面试题
物业管理应届生求职信
2013/10/28 职场文书
领导班子四风表现材料
2014/08/23 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
篮球赛新闻稿
2015/07/17 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis