注意:我不确定这是属于这里还是属于Programmers,但我有点害怕因为JavaScript而无论如何都会将它移到StackOverflow。
我正在弄清楚我正在编写的插件使用什么模式。当我在看其他插件时,最上面的插件相当受欢迎(我在本例中使用了Underscore.js的_.extend
方法)。我不喜欢的是,我需要在任何地方使用this
我认为可能会损害缩小并使我的代码更难阅读。另一方面,它很容易扩展。
var App = function(options) {
this.initialize(options);
};
_.extend(App.prototype, {
initialize: function(options) {
this.options = options || {};
this.doStuff();
},
doStuff: function() {
if (this.options.talk) {
return "Doing stuff.";
}
}
});
var myApp = new App();
myApp.hasOptions = function() { return !!this.options; }; // will return false
另一种方法是使用闭包。最大的好处是代码易于阅读,并且没有暴露(方法或多或少是私有的)。但问题在于它不可扩展。
var App = function(options) {
options = options || {};
function initialize() {
doStuff();
};
function doStuff() {
if (options.talk) {
return "Doing stuff.";
}
};
initialize();
};
var myApp = new App();
myApp.hasOptions = function() { return !!options; }; // will throw a ReferenceError
我不认为我的插件需要可扩展性;它是/ html out插件中的文本。我可以添加对几个事件回调的支持,以帮助其他开发人员将其与应用程序联系起来。
我忽略了什么吗?无论如何我应该使用可扩展代码,使用闭包会遇到麻烦吗?
答案 0 :(得分:1)
缺乏私密性确实是一种语言,我不会让它决定你的设计。
这可能会缩小为a = this; a.foo();
战斗gzip非常好的字节是不值得的。大部分开销是建立TCP连接;额外的数据包并不那么引人注目。闭包对它们来说也有很多开销,最终你会得到代表相同功能的不同对象。如果您正在创建一个实例,这不是问题,但它可以开始加起来。