Нет, производительности почти не будет.Даже присоединение функций к прототипу (ам) должно занимать всего несколько мс (возможно, 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, но вы все равно должны быть разрешены, если хотите!