2

我无法得到这个代码结构的生存与谷歌关闭编译器混淆。下面是一些示例代码:的Javascript模块模式,原型和谷歌关闭

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; 

但事情似乎打破自己的封闭相应的执行既可以当原型方法被调用或当。

任何帮助表示赞赏。

回答

3

这个确切的模式不使用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() {} 
    }; 
})(); 

随着上述任何一种方法,你的出口应能正常工作。

注:第二个选项将只从最新的源代码构建一个编译器的工作,因为它涉及的是刚刚在上周修正了一个错误。