获取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读取ASP设定的COOKIE
Nov 24 Javascript
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
学习ExtJS TextField常用方法
Oct 07 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
jQuery.Form上传文件操作
Feb 05 Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
vue webpack实用技巧总结
Apr 24 Javascript
Vue this.$router.push(参数)实现页面跳转操作
Sep 09 Javascript
基于ant design日期控件使用_仅月份的操作
Oct 27 Javascript
使用vant的地域控件追加全部选项
Nov 03 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
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Python datetime模块使用方法小结
2020/06/18 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
2014学雷锋活动总结
2014/03/09 职场文书
校庆标语集锦
2014/06/25 职场文书
2014离婚协议书范文
2014/09/10 职场文书
小学生优秀评语
2014/12/29 职场文书
创先争优活动个人总结
2015/03/04 职场文书
高二语文教学反思
2016/02/16 职场文书