获取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类库的顶层对象名用户体验分析
Oct 24 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
Feb 14 Javascript
bootstrap PrintThis打印插件使用详解
Feb 20 Javascript
详解angular2封装material2对话框组件
Mar 03 Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 Javascript
vue项目中极验验证的使用代码示例
Dec 03 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
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
DSP接收机前端设想
2021/03/02 无线电
ie6 动态缩略图不显示的原因
2009/06/21 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
jquery ajax请求实例深入解析
2012/11/26 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
python套接字流重定向实例汇总
2016/03/03 Python
Python探索之ModelForm代码详解
2017/10/26 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
django-csrf使用和禁用方式
2020/03/13 Python
python如何爬取动态网站
2020/09/09 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
什么是.net
2015/08/03 面试题
服装设计师职业生涯规划范文
2014/02/28 职场文书
2014年派出所工作总结
2014/11/21 职场文书
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
win sever 2022如何占用操作主机角色
2022/06/25 Servers