Javascript插件模式:可扩展还是闭包



注意:我不确定这是属于这里还是属于程序员,但我有点担心他们会因为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 

我不认为我的插件需要可扩展性;它是一个text-in/html/out插件。我还可以添加对几个事件回调的支持,以帮助其他开发人员将其与他们的应用程序联系起来。

我是不是忽略了什么?无论如何,我应该使用可扩展代码吗?我会在使用闭包时遇到麻烦吗?

缺少私有确实是一件语言问题,我不会让它支配你的设计。

这可能会被缩小为a = this; a.foo();

为gzip非常好的字节而战是不值得的。大部分开销是在建立TCP连接时产生的;额外的一包就不那么显眼了。闭包也有很多开销,最终会得到代表相同函数的不同对象。如果您正在创建一个实例,这不是问题,但它可能会开始累积。

最新更新