5

到现在为止,我使用显示模块模式来构建我的 Javascript,如下所示:

     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();

小提琴

尽管此代码按预期工作,但我最近阅读了一篇文章,如果您有多个实例,此模式会使用大量内存,并且与其他模式相比,它存在一些速度问题。因为我喜欢使用这种模式,所以我搜索了没有所有这些“问题”的类似模式,并且遇到了 Revealing Prototype Pattern。据我所知,JavaScript 的 Prototype 有更好的内存管理。

现在我想知道使用显示原型模式是否更快/更好的记忆?这个基准测试让我感到惊讶,因为模块模式似乎要快得多。有什么理由吗?

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

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

    prototypeModule.prototype = function () {
        var privateVar;

        // @public
        function init( ) {            

        }  

        return {
            init: init
        }
    }();

小提琴 2

我究竟做错了什么?

4

1 回答 1

4

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

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

当实例化大量对象时,只有您Module pattern - Multiple instances在小提琴中命名的东西才会受到内存不足的影响。但是,请注意这不是“模块模式”而是“工厂模式”。

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

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

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

他们模块的代码乱七八糟,无法修复。我什至不想评论那里发生的事情。

我也无法弄清楚如何使用 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') ); 
}
于 2014-06-30T12:31:34.870 回答