我无法让此代码结构在 Google Closure 编译器的混淆中幸存下来。这是一些示例代码:
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();
但是编译器正在重命名所有内容(如预期)。混淆后,如何使我定义的原型(prototype)在代码中的其他位置可用?我尝试过导出如下:
// In place of the prototype object above
myModule.prototype['constructor'] = myModule;
myModule.prototype['foo'] = moduleFoo;
myModule.prototype['bar'] = moduleBar;
window['myModule'] = myModule;
但是当调用原型(prototype)方法或执行相应的闭包时,事情似乎就会崩溃。
感谢任何帮助。
最佳答案
这种确切的模式不适用于使用 ADVANCED_OPTIMIZATIONS 的闭包编译器。相反,您需要稍微重构您的代码:
/** @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() {}
};
})();
使用上述任一方法,您的导出应该可以正常工作。
注意:第二个选项仅适用于从最新源构建的编译器,因为它涉及上周刚刚修复的错误。
关于Javascript 模块模式、原型(prototype)和 Google Closure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276521/