ООП в js

Частные(приватные) методы

Частные методы и переменные доступны только другим частным методам, частным переменным и привилегированным методам. Они позволяют определить код, который будет доступен только внутри самого объекта, но не за его пределами.

Пример:

 
// Конструктор объекта, представляющего учебный класс 
function Classroom( students, teacher ) { 
  // Частный метод, используемый для вывода списка всех учащихся класса 
  function disp() { 
    alert( this.names.join(", ") ); 
  }

  // Сохранение данных о классе в качестве публичных свойств объекта 
  this.students = students; 
  this.teacher = teacher; 

  // Вызов частного метода для вывода ошибки
  disp();
}

// Создание нового объекта classroom
var class = new Classroom( [ "John", "Bob" ], "Mr. Smith" );

// Невыполнимый код, поскольку disp не является публичным свойством объекта
class.disp();

Привилегированные методы

Привилегированные методы могут видеть частные переменные и работать с ними (внутри объекта), будучи доступными пользователям в качестве публичных методов.

Пример:


// Создание нового конструктора объекта User
function User( name, age ) {
  // Попытка определить год рождения пользователя
  var year = (new Date()).getFullYear() - age; //частная(приватная) переменная
  
  // Создание нового привилегированного метода, имеющего доступ
  // к приватной переменной year, но при этом сохраняющего публичность
  this.getYearBorn = function(){
    return year;
  }
}

// Создание нового экземпляра объекта User
var user = new User( "Bob", 44 );

// Проверка правильности возвращенного года
alert( user.getYearBorn() == 1962 );

// И уведомление о том, что нам недоступно частное свойство объекта year
alert( user.year == null );

В основном привилегированные методы генерируются динамически, то есть добавляются к объекту во время выполнения программы, а не при первой компиляции кода. Хотя эта технология с точки зрения вычислительных ресурсов считается более затратной, чем привязка простого метода к прототипу объекта, она оказывается более мощной и гибкой.
Далее показан пример того, что можно сделать, используя динамически генерируемые методы.


// Создание нового объекта user, принимающего объект properties
function User( properties ) {
  // Последовательный перебор свойств объекта и обеспечение
  // для них нужной области видимости (как ранее рассматривалось)
  for ( var i in properties ) { (function(){
      // Создание для свойства нового получателя(читателя)
      this[ "get" + i ] = function() {
        return properties[i];
      };

      // Создание для свойства нового установщика(писателя)
      this[ "set" + i ] = function(val) {
        properties[i] = val;
      };
    })();
  }
}

// Создание нового экземпляра объекта user и передача в него
// объекта, наполняющего его свойства
var user = new User( { name: "Bob", age: 44 } );

// Обратите внимание, что свойства name не существует, поскольку
// внутри объекта properties оно является частным
alert( user.name == null );

// Тем не менее мы можем получить доступ к его значению, используя
// новый метод getname(), который был динамически сгенерирован
alert( user.getname() == "Bob" );

// В заключение мы можем убедиться, что у нас есть возможность
// установить и получить возраст (age), используя недавно сгенерированные функции
user.setage( 22 );
alert( user.getage() == 22 );

Статические методы

Замысел, положенный в основу статических методов, практически не отличается от замысла, касающегося любой обычной функции. Тем не менее основное отличие состоит в том, что статические методы существуют как статические свойства объекта. Будучи свойствами, они недоступны в контексте экземпляра объекта. Доступ к ним открыт только в том же контексте, в котором существует основной объект. Тем, кто знаком с традиционным наследованием классов, это напоминает статические методы класса.

Пример:


// Статический метод, подключенный к объекту User
User.cloneUser = function( user ) {
  // Создание и возвращение нового пользователя
  return new User(
    // Это клон другого объекта user
    user.getName(), user.getAge()  
  );
}

Статические свойства

Следующие инструкции устанавливают в «класс» User и считывают из него статическую строку:

User.greeting = "Привет";
document.write(User.greeting);

Связанная тема Наследование прототипов

Добавить комментарий