您好,欢迎访问一九零五行业门户网

获取JavaScript用户自定义类的类名称的代码_javascript技巧

我们知道,虽然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);
 }
示例:
结果分别为:jsclass, function, number, array和object。
这里需要注意两个地方,一是:jsclass和jsclass的区别,jsclass是类实例,而jsclass返回类型却是function哦;第二个是如果是系统类型,使用typeof得到的类型都是小写的,比如number、array或objece啥的,而使用__typeof__获得的类型名称是和其类型名匹配的,首字母都大写。
其它类似信息

推荐信息