我无法通过Google Closure Compiler获得此代码结构以避免混淆。这是一些示例代码:
var MyModule = (function()
{
function myModule()
{
// Constructor
}
function moduleFoo(url)
{
// Method
}
function moduleBar()
{
// Method
}
myModule.prototype = {
constructor: myModule,
foo: moduleFoo,
bar: moduleBar
};
return myModule;
})();
在我的代码中,我需要能够编写如下内容:
var myMod = new MyModule();
myMod.foo();
myMod.bar();
然而,编译器正在重命名所有内容(如预期的那样)。如何在混淆后制作我在代码中其他地方定义的原型?我尝试过如下导出:
// In place of the prototype object above
myModule.prototype['constructor'] = myModule;
myModule.prototype['foo'] = moduleFoo;
myModule.prototype['bar'] = moduleBar;
window['myModule'] = myModule;
但是当调用原型方法或执行相应的闭包时,事情似乎都会崩溃。
感谢任何帮助。
答案 0 :(得分:3)
这种确切的模式不适用于使用ADVANCED_OPTIMIZATIONS的Closure编译器。相反,您需要稍微重构一下代码:
/** @constructor */
function MyModule()
{
// Constructor
}
(function() {
function moduleFoo(url)
{
// Problem using "this" keyword. Will require @this annotation.
}
MyModule.prototype = {
foo: moduleFoo
};
MyModule.prototype.bar = function() {
// "this" keyword works fine.
};
})();
或者喜欢:
/** @const */
var MyNamespace = {};
(function() {
/** @constructor */
MyNamespace.MyModule = function() {};
MyNamespace.MyModule.prototype = {
constructor: function() {},
foo: function(url) {},
bar: function() {}
};
})();
使用上述任一方法,您的导出都应正常工作。
注意:第二个选项仅适用于从最新源构建的编译器,因为它涉及上周刚修复的错误。