获取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 写类方式之八
Jul 05 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
javascript中强制执行toString()具体实现
Apr 27 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
深入学习js瀑布流布局
Oct 14 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 Javascript
JS数据类型分类及常用判断方法
Nov 19 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中的strpos使用示例
2014/02/27 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python装饰器初探(推荐)
2016/07/21 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
tensorflow的计算图总结
2020/01/12 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
建设投标担保书
2014/05/13 职场文书
护士2014年终工作总结
2014/11/11 职场文书
居住证明范文
2015/06/17 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
nginx搭建NFS网络文件系统
2022/04/14 Servers