以下脚本是一个简单的类注册脚本。我不想在全局窗口对象上存储类,但我仍然想让new MyClass2();
工作。如果我能够将obj
变量定义为window
之类的全局对象,那么以下代码应该可以正常工作。
因此obj
对象上的每个属性都应该在defineClass
函数范围内作为变量使用。
是否有可能或者我应该使用注释代码进行堆叠?
(function() {
var obj = {};
window.defineClass = function(className, cb) {
obj[className] = cb.call(obj /*, obj*/ );
}
window.start = function() {
new obj.MyClass();
}
})();
defineClass('MyClass', function( /*obj*/ ) {
function MyClass() {
this.obj = new MyClass2();
//this.obj = new obj.MyClass2();
}
window.MyClass = MyClass;
return MyClass;
});
defineClass('MyClass2', function( /*obj*/ ) {
function MyClass2() {
console.log('MyClass2');
}
return MyClass2;
});
start()

答案 0 :(得分:0)
如果您希望符号new MyClass2()
起作用,请在全局范围或闭包中定义function MyClass2(){}
,例如:
defineClass('MyClass', function() {
function MyClass() {
this.obj = new MyClass2();
}
window.MyClass = MyClass;
return MyClass;
function MyClass2(){}
});
window
是一个特殊的全局对象,window.window
本身就是window
。
使用模块加载器对于这类问题非常方便,例如。 requirejs,ES6 import
等
使用iframe
是另一种可能的解决方案。