有时可以通过使用上下文来定义哪个更好。
我如何在Prototype和Closure编码方法之间进行选择的三个约束(我积极使用两者):
- 性能/资源
- 压缩要求
- 项目管理
1. 性能/资源
对于对象的单个实例,任何一种方法都可以。任何速度优势很可能可以忽略不计。
如果我要实例化其中的 100,000 个,例如构建图书库,那么Prototype Method将是首选。所有的.prototype。函数只会被创建一次,如果使用Closure Method,这些函数不会被创建 100,000 次。资源不是无限的。
2. 压缩
如果压缩效率很重要(例如:大多数浏览器库/module),请使用Closure Method。请参阅以下说明:
压缩 - 原型方法
function Book(title) {
this.title = title;
}
Book.prototype.getTitle = function () {
return this.title;
};
YUI 是否压缩为
function Book(a){this.title=a}Book.prototype.getTitle=function(){return this.title};
节省约 18%(所有空格/制表符/返回)。此方法需要公开变量/函数(this.variable=value),以便每个原型函数都可以访问它们。因此,无法在压缩中优化这些变量/函数。
压缩 - 闭合方法
function Book(title) {
var title = title; // use var instead of this.title to make this a local variable
this.getTitle = function () {
return title;
};
}
YUI 是否压缩为
function Book(a){var a=a;this.getTitle=function(){return a}};
节省约 33%。可以优化局部变量。在具有许多支持功能的大型module中,这可以显着节省压缩。
3. 项目管理
在一个有多个开发人员的项目中,他们可能在同一个module上工作,如果不受性能或压缩的限制,我更喜欢该module的原型方法。
对于浏览器开发,我可以在我自己的“test.js”(阅读后记)中覆盖“production.js”中的 producton.prototype.aFunction 以进行测试或开发,而无需修改“production.js” ,它可能正在由不同的开发人员积极开发。
我不是复杂的 GIT 存储库检出/分支/合并/冲突流的忠实粉丝。我更喜欢简单。
此外,通过测试平台重新定义或“劫持”module功能的能力可能是有益的,但在这里解决太复杂了......