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() {} 
    }; 
})(); 

隨着上述任何一種方法,你的出口應能正常工作。

注:第二個選項將只從最新的源代碼構建一個編譯器的工作,因爲它涉及的是剛剛在上週修正了一個錯誤。