获取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 相关文章推荐
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
jQuery中$.grep() 过滤函数 数组过滤
Nov 22 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
Sep 19 jQuery
jQuery实现列表的增加和删除功能
Jun 14 jQuery
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
Vue动态组件和异步组件原理详解
May 06 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 Javascript
js实现车辆管理系统
Aug 26 Javascript
用javascript制作qq注册动态页面
Apr 14 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 cookie 登录验证示例代码
2009/03/16 PHP
PHP写日志的实现方法
2014/11/05 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
2010/10/17 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
详解Python Socket网络编程
2016/01/05 Python
Sanic框架配置操作分析
2018/07/17 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
个人简历的自荐信
2013/10/23 职场文书
个性发展自我评价
2014/02/11 职场文书
环保建议书300字
2014/05/14 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
公司岗位说明书
2015/10/08 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
2022漫威和DC电影上映作品
2022/04/05 欧美动漫