Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 显示模块/原型模式_Javascript_Prototype_Revealing Module Pattern - Fatal编程技术网

Javascript 显示模块/原型模式

Javascript 显示模块/原型模式,javascript,prototype,revealing-module-pattern,Javascript,Prototype,Revealing Module Pattern,到目前为止,我一直使用显示模块模式来构造Javascript,如下所示: var module = (function() { var privateVar; // @public function publicFunction( ) { } return { publicFunction: publicFunction } })();

到目前为止,我一直使用显示模块模式来构造Javascript,如下所示:

     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();

尽管这段代码工作正常,但我最近读到一篇文章说,如果有多个实例,这种模式会占用大量内存,而且与其他模式相比,它存在一些速度问题。因为我喜欢使用这个模式,所以我搜索了一个没有所有这些“问题”的类似模式,然后我发现了这个原型模式。据我所知,JavaScript的原型具有更好的内存管理

现在我想知道使用原型模式对内存来说是否更快/更好?我很惊讶,因为模块模式似乎快得多。有什么原因吗

此外,我无法理解如何使用显示原型模式拥有多个实例(与上面的显示模块模式Fiddle相比):

我做错了什么

尽管这段代码工作正常,但我最近在一篇文章中提到,如果有多个实例,这种模式会占用大量内存

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

只有您在小提琴中标题为“模块模式-多个实例”的东西在实例化大量对象时才会受到影响。但是,请注意,这不是“模块模式”,而是“工厂模式”

现在我想知道使用原型模式对内存来说是否更快/更好

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

我很惊讶,因为模块模式似乎快得多。有什么原因吗

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

我也不知道如何拥有多个原型模式的实例

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

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

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

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

如果您想了解更多关于原型和构造函数的信息,您可以看到这个答案。最后是指向特定于实例的受保护成员的实现的链接。如果您喜欢显示模块模式,还可以尝试使用最终模块模式构建代码:谢谢!如果我理解正确,你是说我必须使用公共属性,比如私有变量的
this.PROP
?有什么“更好”的方法可以做到这一点,因为如果您使用jQuery事件处理程序之类的东西,这会变得很棘手。虽然有效,但我想知道是否有什么需要改进的地方?我可能会将我的
init
函数重命名为例如
addEventHandlers
,因为在我看来,与其他模式相比,这部分(
var prototypeModule=function(el){/*init_这里*/};
)是我实际的init函数?对吗?如果您想从原型函数访问它们,是的,您需要公共属性。或者,您并不是对所有内容都使用原型(共享)方法,而是拥有一些可以访问局部变量的特权方法。是的,构造函数是初始化函数,您不需要使用
init()
function Constructor( el ) {
    var privateVar = $( el );
    privateVar.on( 'click', function clickFunction() {
        privateVar.addClass('click');
    });

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