直到现在,我使用显示模块模式来构造我的Javascript,如下所示:
var module = (function() {
var privateVar;
// @public
function publicFunction( ) {
}
return {
publicFunction: publicFunction
}
})();小提琴
虽然这段代码如预期的那样工作,但我最近读到一篇文章说,如果您有多个实例,此模式将使用大量内存,并且与其他模式相比,它存在一些速度问题。由于我喜欢使用这种模式,所以在没有所有这些“问题”的情况下,我搜索了类似的模式,并遇到了揭示性的原型模式。据我所知,JavaScript`s的原型具有更好的内存管理。
现在,我想知道使用显示原型模式是否更快/更好?这个基准让我感到惊讶,因为模块模式看起来要快得多。有什么理由吗?
另外,我不知道如何使用显示原型模式拥有多个实例(与上面的显示模块模式Fiddle相比):
var prototypeModule = function( el ) {
this.init( );
};
prototypeModule.prototype = function () {
var privateVar;
// @public
function init( ) {
}
return {
init: init
}
}();小提琴2
我做错了什么?
发布于 2014-06-30 12:31:34
虽然这段代码如预期的那样工作,但我最近在一篇文章中指出,如果您有多个实例,此模式将使用大量内存。
您在第一个代码段中显示的代码是一个单例模块,没有“多个实例”。完全没问题。
只有你在小提琴中命名为Module pattern - Multiple instances的东西在实例化大量的对象时才会受到内存不足的影响。但是,请注意,这不是“模块模式”,而是“工厂模式”。
现在,我在想,使用显示的原型模式是否更快/更好?
一般来说,如果应用正确,是的。
这个基准让我感到惊讶,因为模块模式看起来要快得多。有什么理由吗?
他们的模块的代码已经乱七八糟了。我甚至不想对那里发生的事情发表评论。
另外,我也想不出如何用揭示的原型模式拥有多个实例。
原型的好处是它的属性在所有实例之间共享。这意味着所有实例的.init方法指向相同的函数,该函数在其显示模块范围内只有一个privateVar --该变量只存在于所有实例一次!它是静态的,不是特定于实例的。
如果要使用原型,就不能访问真正的私有变量;您需要使用公共属性。但是,您的clickFunction无论如何都需要一个本地(私有)变量来关闭它,所以在这里不使用原型没有什么错:
function Constructor( el ) {
var privateVar = $( el );
privateVar.on( 'click', function clickFunction() {
privateVar.addClass('click');
});
console.log( 'constructor: ' + privateVar.attr('id') );
}https://stackoverflow.com/questions/24488196
复制相似问题