揭示模块/原型模式

Dan*_*iel 5 javascript prototype revealing-module-pattern

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

     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();
Run Code Online (Sandbox Code Playgroud)

小提琴

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

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

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

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

    prototypeModule.prototype = function () {
        var privateVar;

        // @public
        function init( ) {            

        }  

        return {
            init: init
        }
    }();
Run Code Online (Sandbox Code Playgroud)

小提琴2

我究竟做错了什么?

Ber*_*rgi 4

尽管此代码按预期工作,但我最近红色了一篇文章,如果您有多个实例,则此模式会使用大量内存

您在第一个片段中提供的代码是一个单例模块,没有“多个实例”。完全没问题。

只有您在小提琴中标题的东西在实例化大量对象时Module pattern - Multiple instances才会遭受内存缺点。但是,请注意,这不是“模块模式”,而是“工厂模式”。

现在我想知道使用揭示原型模式是否会更快/更好地记忆?

一般来说,如果应用正确,是的。

这个基准测试让我感到惊讶,因为模块模式似乎要快得多。有什么理由吗?

他们的模块代码混乱不堪,无法修复。我什至不想评论那里正在发生的事情。

另外,我不知道如何使用揭示原型模式拥有多个实例

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

如果要使用原型,则无法访问真正私有的变量;您将需要使用公共财产。但是,无论如何,您都clickFunction需要一个本地(私有)变量来实现其闭包,因此此处不使用原型不会有任何问题:

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

    console.log( 'constructor: ' + privateVar.attr('id') ); 
}
Run Code Online (Sandbox Code Playgroud)