Оригинал: «Performance of private members in JavaScript».
Единственный способ реализации объектов с закрытыми членами в Javascript — использование замыканий, при котором привилегированные методы создаются в конструкторе. Но при таком подходе вы можете столкнуться с некоторыми проблемами в производительности, поскольку через прототипы ограничить доступ невозможно. Поэтому не рекомендуется использовать закрытые члены в объектах, которые часто создаются. Многие просто ставят символ подчёркивания перед названиями закрытых членов, чтобы отличать их от открытых. В этой статье я покажу, как много памяти и вычислительной мощности используют закрытые члены.
Вот код, который я использовал для тестирования. Он создаёт 10 методов для каждого класса.
// Методы определяются в прототипе var PubClass = function(){ this.pub0 = 0; this.pub1 = 0; ... this.pub9 = 0; } PubClass.prototype.method0 = function(){ this.pub0++; } PubClass.prototype.method1 = function(){ this.pub1++; } ... PubClass.prototype.method9 = function(){ this.pub9++; } // Методы определяются в конструкторе var PrivClass = function(){ var priv0 = 0; var priv1 = 0; ... var priv9 = 0; this.method0 = function(){ priv0++; } this.method1 = function(){ priv1++; } ... this.method9 = function(){ priv9++; } }
Использование памяти
На этом графике показан объём используемой памяти при создании 100 000 экземпляров этих классов. В столбцах Public+ и Private+ указан объём памяти, требующийся для хранения экземпляров, а столбец Пустая страница показывает память, которую занимает браузер с одной открытой страницей.

Как вы можете заметить, методы, определённые в конструкторе занимают в 3-6 раз больше памяти. Также, обратите внимание на Internet Explorer, который может съесть всю память, если вы не будете предусмотрительны.
Производительность
Приведённая ниже таблица содержит количество вызовов каждой команды в секунду (в тысячах). Чем больше, тем лучше. new PubClass и new PrivClass это вызовы конструкторов, остальные две колонки — вызовы методов.
| new PubClass | new PrivClass | методы PubClass | методы PrivClass | |
|---|---|---|---|---|
| FF 3.5 | 927 | 185 | 15400 | 1200 |
| FF 3 | 507 | 121 | 1600 | 1400 |
| IE 8 | 274 | 123 | 795 | 981 |
| Chrome 2 | 26000 | 1800 | 39000 | 57000 |
| Safari 4 | 10000 | 1600 | 50000 | 46000 |
| Opera 9.64 | 1600 | 700 | 2100 | 2800 |
*В этой таблице приведены результаты для классов, имеющих всего один метод. При использовании 10 методов конструкции new PubClass потребуется почти в 2 раза больше времени, а new PrivClass — в 4-8 раз больше.
Вызовы методов быстры, даже если те создаются в конструкторе (исключение составляет Firefox 3), вызовы конструкторов — заметно медленнее.
Заключение
Никогда не используйте закрытые члены в совокупности с привилегированными методами для более чем тысячи объектов (5 Мб в IE), так как они требуют больше памяти. Также стоит избегать их, если вам необходимо создавать более двухсот объектов одновременно. Если же вы разрабатываете приложение для мобильных платформ, стоит поставить ещё более жёсткие ограничения.
Ключевые слова: JavaScript, закрытые члены, открытые члены, конструкторы