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