到目前为止,我使用了Revealing Module Pattern来构建我的Javascript,如下所示:
var module = (function() {
var privateVar;
// @public
function publicFunction( ) {
}
return {
publicFunction: publicFunction
}
})();
虽然这段代码按预期工作,但我最近读了一篇文章,如果你有多个实例,这个模式会占用大量内存,而且与其他模式相比,它有一些速度问题。由于我喜欢使用这种模式,所以我搜索了类似的模式而没有所有这些"问题"我偶然发现了Revealing Prototype Pattern。据我所知,JavaScript的Prototype具有更好的内存管理。
现在我想知道使用Revealing Prototype Pattern是否更快/更好的内存? This benchmark让我感到惊讶,因为模块模式似乎要快得多。有什么缘故吗?
另外,我无法弄清楚如何使用Revealing Prototype Pattern创建多个实例(与上面的Revealing Module Pattern Fiddle相比):
var prototypeModule = function( el ) {
this.init( );
};
prototypeModule.prototype = function () {
var privateVar;
// @public
function init( ) {
}
return {
init: init
}
}();
我做错了什么?
答案 0 :(得分:4)
虽然这段代码按预期工作,但最近我发了一篇文章,如果你有多个实例,这个模式会占用大量内存
您在第一个代码段中显示的代码是单例模块,没有"多个实例"。这完全没问题。
当你实例化大量的对象时,只有你在小提琴中标题Module pattern - Multiple instances
的东西才会受到memory disadvantages的影响。但请注意,这不是"模块模式"但是"工厂模式"。
现在我想知道使用Revealing Prototype Pattern对内存是否更快/更好?
一般来说,如果应用得当,是的。
This benchmark让我感到惊讶,因为模块模式似乎要快得多。有什么理由吗?
他们模块的代码搞砸了所有修复。我甚至都没有试图评论那里发生的事情。
此外,我无法弄清楚如何使用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') );
}