首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示模块/原型模式

显示模块/原型模式
EN

Stack Overflow用户
提问于 2014-06-30 10:37:36
回答 1查看 2.1K关注 0票数 5

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

代码语言:javascript
复制
     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();

小提琴

虽然这段代码如预期的那样工作,但我最近读到一篇文章说,如果您有多个实例,此模式将使用大量内存,并且与其他模式相比,它存在一些速度问题。由于我喜欢使用这种模式,所以在没有所有这些“问题”的情况下,我搜索了类似的模式,并遇到了揭示性的原型模式。据我所知,JavaScript`s的原型具有更好的内存管理。

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

另外,我不知道如何使用显示原型模式拥有多个实例(与上面的显示模块模式Fiddle相比):

代码语言:javascript
复制
    var prototypeModule = function( el ) {
        this.init( );
    };

    prototypeModule.prototype = function () {
        var privateVar;

        // @public
        function init( ) {            

        }  

        return {
            init: init
        }
    }();

小提琴2

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-30 12:31:34

虽然这段代码如预期的那样工作,但我最近在一篇文章中指出,如果您有多个实例,此模式将使用大量内存。

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

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

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

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

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

他们的模块的代码已经乱七八糟了。我甚至不想对那里发生的事情发表评论。

另外,我也想不出如何用揭示的原型模式拥有多个实例。

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

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

代码语言:javascript
复制
function Constructor( el ) {
    var privateVar = $( el );
    privateVar.on( 'click', function clickFunction() {
        privateVar.addClass('click');
    });

    console.log( 'constructor: ' + privateVar.attr('id') ); 
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24488196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档