我还在学习javascript,并且会将原型用于大多数事情(即Brendan Eich here),但我认为我发现功能闭合的性能和一致性更好(我知道我可能已经过度优化了).我一直在测试的一种原型模式:
function PrototypeA() {} PrototypeA.prototype.a = 0; PrototypeA.prototype.b = 0; PrototypeA.prototype.someMath = function() { this.a += 1; this.b += 2; }; var Test = new PrototypeA(); Test.someMath();
读完这篇文章后决定(太棒了!)post到基准封口.目前的封闭模式我正朝着:
var SubModule = new((function() { var a = 0; var b = 0; var someMath = function() { a += 1; b += 2; }; return function() { this.someMath = someMath }; })())();
我发现由于测试设置中的错误(例如在基准测试中调用构造函数或以导致不同范围遍历路径的方式调用方法),各种模式的许多基准都会产生误导.我只是想测试方法执行.
在本地进行了大量的基准测试(基于许多不同模式的benchmark.js)后,我提出了值得注意的模式:
我的发现似乎支持组织良好的闭包不会在执行时间上偏离其他类型的对象(我松散地使用术语“类型”).我意识到由于基准测试或设置上的任何数字或错误,我可能完全错误.
谢谢你的期待!
解决方法
现在,有一些问题.首先,当你只引用一次或两次时,使用它会明显加快.在这个例子中并非如此,但值得一提.添加对此引用的次数越多,原型依赖代码就越慢.以this simple perf为例.其次,如果你构建了很多这些模块(例如,如果你正在构建一个数据网格),那么关闭时构造速度非常慢,并且浪费了大量内存.有关速度差,请参见this example.您添加的方法和属性越多,它就越糟糕.这是因为每次创建一个新的闭包都会产生独特的功能和属性,而基于原型的闭包只会重复使用相同的东西.
在任何一种情况下,我的谦虚建议只是看看你正在编程的情况.大多数时候,使用原型是要走的路 – 可读性[在某些情况下],可重用性,可扩展性……但如果它们太慢,那么你就是不能使用它们.话虽如此,将这两个概念结合起来给你提供可重复使用的模块化设置并不会经常受到影响的方法是没有错的.例如,尝试使用’Mixins’:
var Mixin = { interval: 100,finish: function () { window.clearInterval(this.intervalRef); },start: function (callback) { this.intervalRef = window.setInterval(callback,this.interval) }; var Module = (function () { function getMessage () { return "weee!"; } var somethingThatReallyNeedsSpeed = function () { var iterations,self = this; this.start(function () { console.log(getMessage()); iterations++; if(iterations > 10000) { self.finish(); } }); } somethingThatReallyNeedsSpeed.prototype = Mixin; return somethingThatReallyNeedsSpeed; })();
在这个例子中,由于原型只是设置为引用Mixin对象,因此构造速度不会受到影响 – 有两种方法和特性函数每次都不需要构造的属性,但它仍然可用通过这个.
< /咆哮>