Dan*_*iel 5 javascript prototype revealing-module-pattern
到目前为止,我使用Revealing Module Pattern来构建我的Javascript,如下所示:
var module = (function() {
var privateVar;
// @public
function publicFunction( ) {
}
return {
publicFunction: publicFunction
}
})();
Run Code Online (Sandbox Code Playgroud)
虽然这段代码按预期工作,但我最近读到一篇文章,如果你有多个实例,这个模式使用大量内存,并且与其他模式相比,它有一些速度问题.由于我喜欢使用这种模式,我在没有所有这些"问题"的情况下搜索了类似的模式,并且我遇到了Revealing Prototype Pattern.据我所知,JavaScript的Prototype具有更好的内存管理.
现在我想知道使用Revealing Prototype Pattern是否更快/更好的内存?这个基准让我感到惊讶,因为模块模式似乎要快得多.有什么缘故吗?
另外,我无法弄清楚如何使用Revealing Prototype Pattern创建多个实例(与上面的Revealing Module Pattern Fiddle相比):
var prototypeModule = function( el ) {
this.init( );
};
prototypeModule.prototype = function () {
var privateVar;
// @public
function init( ) {
}
return {
init: init
}
}();
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
尽管此代码按预期工作,但我最近红色了一篇文章,如果您有多个实例,则此模式会使用大量内存
您在第一个片段中提供的代码是一个单例模块,没有“多个实例”。完全没问题。
只有您在小提琴中标题的东西在实例化大量对象时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') );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1836 次 |
| 最近记录: |