在Javascript中向对象原型添加许多函数时的性能问题?

时间:2011-04-06 21:12:59

标签: javascript performance object prototype

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

编辑:仅仅是为了获取信息,我正在扩展内置对象。

1 个答案:

答案 0 :(得分:4)

不,几乎没有性能受到打击。即使将功能附加到原型上也只需要几毫秒(可能是5毫秒),超过200个功能就可以在一个位置内存在内存中,永远不会被复制,你永远不会注意到任何东西。当然,假设您附加了.prototype的东西。

为什么没有速度命中:为了解析对象的函数调用: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或2百万个函数并不重要(尽管如果你有2百万个你会吃掉大量的内存)。

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

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

请不要延长Array.prototype - 这让我很烦。但是很多其他人都这样做,所以它不是 - 不好......论证是你不是假设在数组上使用for-in循环,现在很多人都没有因为Prototype.js,但如果你愿意,你仍然应该被允许!