2011-04-06 45 views
2

我目前正在为许多不同的Javascript对象编写扩展方法库。例如,如果我在同一个源文件中向不同对象(通过它们的原型)添加200多种方法,是否有任何性能方面的考虑?在Javascript中添加许多函数到对象原型时的性能问题?

编辑:仅供参考,我扩展了内置对象。

+1

您是否正在扩展像Array,Function,Object等内置对象? – 2011-04-06 21:14:50

+0

是............ – 2011-04-06 21:18:56

+0

您是否考虑过某种动态加载系统? – 2011-04-06 21:20:25

回答

4

不,几乎没有性能问题。即使将函数附加到原型应该只需要几毫秒(也许是5毫秒),并且除此之外,您还有200个函数坐在一个地方的内存中,永远不会被复制,您将永远不会注意到任何东西。当然,假设你正在附加某种东西的原型。

至于为什么没有速度命中:为了解决一个对象上的函数调用:foo.doSomething(),内部引擎需要遍历该对象的对象作用域和原型链。基本上,它这样做:

  • if(Object.hasOwnProperty('doSomething')){ // run Object.doSomething
  • if(Object.__proto__.hasOwnProperty('doSomething')){ // run Object.__proto__.doSomething
  • while(Object.__proto__.__proto__.__proto__.....){ // repeat

层的,这是一个哈希值,所以查找是恒定时间。 在查询速度方面,如果原型链中有2个或200万个函数(尽管如果你有200万个用户会吃掉大量的内存),这并不重要。

供参考:jQuery内部有511个函数。 200并不是那么多

备注:请勿扩展Object.prototype - 只是不要。如果你这样做,你会打破for-in循环,或者如果人们不使用明确的if(obj.hasOwnProperty(foo))检查,至少可以打破它们。你也会让对象散列的for-in循环变慢,这是你遇到的扩展原型的唯一潜在的减速。

而且请不要延伸Array.prototype - 它让我很烦恼。但很多其他人都这样做,所以它不是坏的......这个说法是你不是假设在数组中使用for-in循环,现在很多人不会因为Prototype.js ,但你仍然应该被允许,如果你想!