揭示模块模式缺点
回答
我读过@nemesv引用了我的文章(谢谢:)),我认为还有一个缺点没有提到,所以我想我会在这里添加它作为参考。下面是文章报价:
缺点
这种模式的缺点是,如果一个私有函数是指 公共职能,公共职能不能被覆盖,如果补丁 是必要。这是因为私有函数将继续以 引用私有实现,并且该模式不适用于 公共成员,仅适用于函数。
引用私有变量的公共对象成员也是 受上述无补丁规则注释的约束。
因此,使用“展示模块”模式 创建的模块可能比使用原始模块 模式创建的模块更脆弱,因此在使用过程中应该小心。
而且我另外:
不能使用继承这种模式。例如:
var Obj = function(){
//do some constructor stuff
}
var InheritingObj = function(){
//do some constructor stuff
}
InheritingObj.prototype = new Obj();
InheritingObj.prototype.constructor = InheritingObj;
这对于JS继承一个简单的例子,但使用Revealing Prototype Pattern当你需要这样做:
InheritingObj.prototype = (function(){
//some prototype stuff here
}());
这将覆盖你继承。
它看起来像它与Object.create(urlBuilder)完美的工作;继承的另一种方法是这样http://jsfiddle.net/d0n7kfmx/你怎么看? – user2734550
揭示模块模式(RMP)创建的对象在覆盖方面表现不佳。结果,使用RMP制造的物体不能很好地用作原型。因此,如果您使用RMP创建要在继承链中使用的对象,则不要这样做。 这个观点是我自己的观点,反对揭示原型模式的支持者。
要看到坏的继承行为,采取了网址构建器的下面的例子:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
撇开为什么你会使用RMP对于没有专用部件对象的问题,注意,如果您取回返回的对象,并用“http://stackoverflow.com”覆盖urlBase,你会期望build()的行为适当地改变。它并不像看到以下内容:
var builder = new rmpUrlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build("/questions"); // prints "http://my.default.domain/questions" not "http://stackoverflow.com/questions"
对比度与下列网址构建器实现
function urlBuilder = function(){
return {
urlBase: "http://my.default.domain/".
build: function(relUrl){ return this.urlBase + relUrl;}
}
}
var builder = new urlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build()); // prints "http://stackoverflow.com/questions"
其行为正确的行为。
您可以使用此范围作为修正透露出模块模式的行为如下
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
但宁可失败透露出模块模式的目的。有关详细信息,请参见我的博客文章http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/
其他缺点与所述显示模块模式包括:
- 与Return语句的公共职能紧密耦合
- 对象的混合使用字面公共职能和私人功能 独立宣言
我推荐使用明确的模块模式在显露的模块模式 (https://github.com/tfmontague/definitive-module-pattern)
我不会推荐这种模式,因为它与揭示模块模式没有本质区别。它与被接受的答案中的重写和原型有相同的缺点。 –
问题是关于“揭示模块”模式的缺点。这不是关于使用模块模式的决定。 – tfmontague
- 1. Typescript揭示模块模式
- 2. 揭示模块模式
- 3. Javascript揭示模块模式
- 4. JSHint扔在揭示模块模式
- 5. 揭示模块模式:对象是undefined
- 6. 理解揭示模块化模式
- 7. 揭示模块模式和超时
- 8. 揭示模块模式命名约定
- 9. 使用Knockout-es5揭示模块模式
- 10. 揭示模块模式,KnockoutJS和CoffeeScript
- 11. JSDOC和揭示模块模式
- 12. ES6模块VS揭示模块图案
- 13. Javascript:混合构造函数模式和揭示模块模式
- 14. 揭示模块模式函数初始化样式
- 15. 揭示模式用例
- 16. 揭示模块模式添加子模块和访问私人功能
- 17. 如何在jQuery的document.ready中使用揭示模块模式?
- 18. TypeScript是不是使用类的揭示模块模式?
- 19. javascript揭示模块模式在服务器上被忽略
- 20. Java脚本揭示模块模式创建多个对象
- 21. 揭示的Javascript模块模式和变量
- 22. JavaScript揭示模块模式重新分解建议
- 23. 使用揭示模块模式Knockout和Asp.net MVC4
- 24. 揭示模块模式方法回声未定义
- 25. 揭示模块模式和文档已准备就绪
- 26. 各种开口打造揭示模块模式
- 27. 揭示模块模式得到未定义变量
- 28. 在jQuery/JavaScript中使用揭示模块模式
- 29. 揭示模块模式,未定义属性
- 30. 使用构造函数揭示模块模式
选中此文章:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript最后有一个缺点部分。 – nemesv
定义模块模式还克服了模块模式和显示模式的一些缺点(如与返回语句的紧密耦合,公共和私有函数如何声明,私有和公共子例程的非声明性命名空间以及对象的混合使用字面与返回语句):http://github.com/tfmontague/definitive-module-pattern – tfmontague