2

このコード構造を 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;

しかし、プロトタイプ メソッドが呼び出されたとき、または対応するクロージャが実行されたときに、事態は崩壊するようです。

どんな助けでも大歓迎です。

4

1 に答える 1

3

この正確なパターンは、ADVANCED_OPTIMIZATIONS を使用する Closure-compiler ではうまく機能しません。代わりに、コードを少しリファクタリングする必要があります。

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

上記の方法のいずれかを使用すると、エクスポートが正しく機能するはずです。

注: 2 番目のオプションは、先週修正されたばかりのバグが関係しているため、最新のソースからビルドされたコンパイラでのみ機能します。

于 2013-06-24T13:50:28.733 に答える