检查javascript中是否存在类

时间:2018-01-22 13:17:57

标签: javascript class defined

MDN classes concept上工作时,我想检查一个类是否退出(不是对象或函数)以便动态加载它,如果是,则重新定义它。

我尝试了很多方式(typeOf,instanceof ...)失败......

    Class APP{
[...]
    registerModule( moduleName, force ) 
    {
        if( this.modules[ moduleName ] === undefined || force )
        {
console.log( "loading "+moduleName+"/js/"+moduleName+"Module.js ..." );
            //~ TODO : Add a test if class already loaded and if we have to 'unload' or re-define it
            this.loadScript( moduleName+"/js/"+moduleName+"Module.js", function(){
                APP.modules[moduleName] = eval( "new "+moduleName+"()" );
            });
        }else{
            alert( "Moule '"+moduleName+"' already declared !");
        }
    }
}

2 个答案:

答案 0 :(得分:-1)

尝试混合检查班级的独特特征:

var exists = typeof c !== 'undefined' ? classExists(c) : false; 

function classExists(c) {      
     return typeof(c) == "function" && typeof(c.prototype) == "object"
}

https://jsfiddle.net/4ucxseuy/

答案 1 :(得分:-1)

好的,找到了办法:

class APP{
    constructor() {
        this.modules = [];
    }

    registerModule( moduleName, force ) 
    {
        if( this.modules[ moduleName ] === undefined || force )
        {
            if( this.modules[ moduleName ] === undefined )
            {
                this.loadScript( moduleName+"/js/"+moduleName+"Module.js", function(){
                    APP.modules[moduleName] = eval( "new "+moduleName+"()" );
                });
            }else{
                    APP.modules[moduleName] = eval( "new "+moduleName+"()" );
            }
        }else{
            alert( "Le module '"+moduleName+"' est déjà déclaré !");
        }
    }
}

可以这样调用:

APP.registerModule( 'Batch' ,true)

Class在首次加载时会被实例化。 基于相同的类定义,在新模块注册时覆盖对象。类不能重新定义(太糟糕)。 感谢您的评论!