Одна из наиболее общих характеристик традиционных объектно_ориентирован_ ных языков программирования, таких как C++, заключается в возможности объявления частных (private) свойств класса, обращаться к которым можно только из методов этого класса и недоступных за пределами класса. Распростра_ ненная техника программирования, называемая инкапсуляцией данных, заклю_ чается в создании частных свойств и организации доступа к этим свойствам толь_ ко через специальные методы чтения/записи. JavaScript позволяет имитировать такое поведение посредством замыканий (эта тема обсуждается в разделе 8.8), но для этого необходимо, чтобы методы доступа хранились в каждом экземпляре класса и по этой причине не могли наследоваться от объекта_прототипа.
Следующий фрагмент демонстрирует, как можно добиться этого. Он содержит реализацию объекта прямоугольника Rectangle, ширина и высота которого дос_ тупны и могут изменяться только путем обращения к специальным методам:
function ImmutableRectangle(w, h) {
// Этот конструктор не создает свойства объекта, где может храниться
// ширина и высота. Он просто определяет в объекте методы доступа
// Эти методы являются замыканиями и хранят значения ширины и высоты
// в своих цепочках областей видимости.
this.getWidth = function() { return w; } this.getHeight = function() { return h; }
}
// Обратите внимание: класс может иметь обычные методы в объекте_прототипе. ImmutableRectangle.prototype.area = function( ) {
return this.getWidth( ) * this.getHeight( );
};
Первенство открытия этой методики (или, по крайней мере, первенство публи_ кации), вообще говоря, принадлежит Дугласу Крокфорду (Douglas Crockford). Его обсуждение этой темы можно найти на странице http://www.crockford.com/ javascript/private.html.