Javascript 模块模式、原型(prototype)和 Google Closure

标签 javascript prototype google-closure-compiler module-pattern

我无法让此代码结构在 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/

相关文章:

JavaScript继承: How can we inherit object and function where object is created from function using new operator and has prototype functions

javascript - Object.create vs new 在原型(prototype)继承方面

javascript - 如何使大小写函数不区分大小写?

javascript - 加载局部 View 时调用 javascript

javascript - 在 jquery 中使用事件名称和选择器有什么用?

Dojo 请求已经内联的 Dijit 模板 --Google Closure build

javascript - 数组的 Google Closure Compiler 类型注释

javascript - 如何在两个列表框之间移动元素?

Javascript: self 和这个

javascript - 如何在高级编译模式下使用 Google Closure 编译器编译 jQuery UI 小部件?