Javascript模块化设计模式——哪个更好:自调用函数,还是对象文字方法
Javascript modular design pattern - which is better: self-invoking function, or object literal approach?
为了写出更好、更紧凑、更安全的代码,我很高兴在我的Javascript中采用更模块化的模式。然而,在我对这一主题的自我教育中,我发现有不同的方法可以做到这一点。似乎最常见的两种是自调用函数模式(来自本文):
var HTMLChanger = (function() {
var contents = 'contents'
var changeHTML = function() {
var element = document.getElementById('attribute-to-change');
element.innerHTML = contents;
}
return {
callChangeHTML: function() {
changeHTML();
console.log(contents);
}
};
})();
HTMLChanger.callChangeHTML(); // Outputs: 'contents'
console.log(HTMLChanger.contents); // undefined
或者,在另一篇文章中,对象文字方法模式:
var s,
NewsWidget = {
settings: {
numArticles: 5,
articleList: $("#article-list"),
moreButton: $("#more-button")
},
init: function() {
s = this.settings;
this.bindUIActions();
},
bindUIActions: function() {
s.moreButton.on("click", function() {
NewsWidget.getMoreArticles(s.numArticles);
});
},
getMoreArticles: function(numToGet) {
// $.ajax or something
// using numToGet as param
}
};
我相信还有很多其他的模式(其中一些在第一篇文章中描述过)——哪种模式更好,或者更常见?如果我要选择一个默认的模式(除非我有特殊的理由选择另一个模式),它应该是什么,为什么?
混合搭配是完全可以接受的吗?
我不会说哪一种比另一种更好,但我会尽量明确每一种的优点,以便您可以根据自己的情况选择使用哪一种。
构造函数模式用它的属性和方法创建一个对象,它们都是公共的。它很容易理解,你仍然可以在创建后添加功能。
自调用模式(即。SEAF或IIFE)一开始可能看起来更复杂,但它的优点是具有私有属性或方法,因此您可以指定将公开代码的哪一部分。您还可以通过跳过return语句使其完全私有。
有一篇很棒的文章帮助我理解了JavaScript模式,这篇文章是《好的c#习惯如何鼓励坏的JavaScript习惯》。虽然它说从c#到Javascript,但它适合任何使用JS的人。
作为结论,IIFE模式将为您提供您可能想要在模块中添加的所有工具,但这并不意味着在功能不太复杂的某些情况下使用构造函数模式不是更方便。关于混合它们,我个人不喜欢使用几个模式来实现一个目标的项目。在我看来,使用IIFE更强大,更长期有用,但对于快速的&有趣的游戏对象文字可能是一种选择:-)
相关文章:
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 访问函数对象的上下文属性|如何
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 如何将函数对象从javascript传递到Polymer元素
- 为什么函数对象的实例没有继承函数原型属性
- 为什么我会从 JavaScript 函数返回一个命名函数(对象)
- 为什么实例构造函数指向最上面的函数构造函数对象
- 使用object.freeze()扩展函数对象-can't添加字段
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- 为什么茉莉花间谍不't通过引用解析函数对象
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 在 JavaScript 中为函数对象添加别名
- 在 Express JS 中从路由调用函数对象
- 函数对象的名称属性是什么
- 构造函数对象
- 节点.js - 从另一个函数/对象发出事件
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 函数对象__proto__和原型属性
- 类仿真 - 模块模式与函数对象