2011-04-06 20 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 ,但你仍然應該被允許,如果你想!

相關問題