Шаблон модуля Javascript, прототип и закрытие Google

У меня возникли проблемы с тем, чтобы эта структура кода выдержала обфускацию с помощью 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;

Но кажется, что что-то ломается либо при вызове методов-прототипов, либо при выполнении их соответствующих замыканий.

Любая помощь приветствуется.


person adampetrie    schedule 24.06.2013    source источник


Ответы (1)


Этот точный шаблон плохо работает с компилятором Closure, использующим 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() {}
    };
})();

С любым из вышеперечисленных методов ваш экспорт должен работать правильно.

Примечание. Второй вариант будет работать только с компилятором, созданным из последнего исходного кода, поскольку он включает ошибку, которая была исправлена ​​только на прошлой неделе.

person Chad Killingsworth    schedule 24.06.2013