揭示模块/原型模式

时间:2014-06-30 10:37:36

标签: javascript prototype revealing-module-pattern

到目前为止,我使用了Revealing Module Pattern来构建我的Javascript,如下所示:

     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();

Fiddle

虽然这段代码按预期工作,但我最近读了一篇文章,如果你有多个实例,这个模式会占用大量内存,而且与其他模式相比,它有一些速度问题。由于我喜欢使用这种模式,所以我搜索了类似的模式而没有所有这些"问题"我偶然发现了Revealing Prototype Pattern。据我所知,JavaScript的Prototype具有更好的内存管理。

现在我想知道使用Revealing Prototype Pattern是否更快/更好的内存? This benchmark让我感到惊讶,因为模块模式似乎要快得多。有什么缘故吗?

另外,我无法弄清楚如何使用Revealing Prototype Pattern创建多个实例(与上面的Revealing Module Pattern Fiddle相比):

    var prototypeModule = function( el ) {
        this.init( );
    };

    prototypeModule.prototype = function () {
        var privateVar;

        // @public
        function init( ) {            

        }  

        return {
            init: init
        }
    }();

Fiddle 2

我做错了什么?

1 个答案:

答案 0 :(得分:4)

  

虽然这段代码按预期工作,但最近我发了一篇文章,如果你有多个实例,这个模式会占用大量内存

您在第一个代码段中显示的代码是单例模块,没有"多个实例"。这完全没问题。

当你实例化大量的对象时,只有你在小提琴中标题Module pattern - Multiple instances的东西才会受到memory disadvantages的影响。但请注意,这不是"模块模式"但是"工厂模式"。

  

现在我想知道使用Revealing Prototype Pattern对内存是否更快/更好?

一般来说,如果应用得当,是的。

  

This benchmark让我感到惊讶,因为模块模式似乎要快得多。有什么理由吗?

他们模块的代码搞砸了所有修复。我甚至都没有试图评论那里发生的事情。

  

此外,我无法弄清楚如何使用Revealing Prototype Pattern获得多个实例

原型的好处是它的属性在所有实例之间共享。这意味着所有实例的.init方法都指向同一个函数,该函数在其显示模块范围内只有一个privateVar - 此变量仅对所有实例存在一次!它是静态的,不是特定于实例的。

如果要使用原型,则无法访问真正的私有变量;您将需要使用公共属性。但是,你的clickFunction无论如何都需要一个本地(私有)变量来关闭它,所以在这里不使用原型就没有错:

function Constructor( el ) {
    var privateVar = $( el );
    privateVar.on( 'click', function clickFunction() {
        privateVar.addClass('click');
    });

    console.log( 'constructor: ' + privateVar.attr('id') ); 
}