Опубликован: 19.10.2006 | Уровень: для всех | Доступ: платный
Лекция 8:

Основы объектно-ориентированного программирования

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Переменные Private, Public и Static

Способ определения переменных в объекте определяет, какие методы этого объекта можно использовать для доступа к этим переменным. В JavaScript при работе с объектно-ориентированным кодом используется пять уровней методов и свойств.

  1. Скрытая ( Private ) - объявляется с помощью var variableName или function functionName внутри объекта. Могут быть доступны только другим скрытым или привилегированным функциям.
  2. Открытая ( Public ) - объявляется с помощью this.variableName внутри объекта. Может изменяться любой функцией или методом.
  3. Привилегированная ( Privileged ) - объявляется с помощью this.functionName = function(){ ... } внутри объекта. Доступна для любой функции или метода и может обращаться или изменять любую скрытую переменную.
  4. Прототипированная ( Prototype ) - объявляется с помощью Class.prototype.variableName или Class.prototype.functionName. Объявленные таким образом функции будут иметь доступ к любой открытой или прототипированной функции. Попытки изменить созданную таким образом переменную будут вместо этого создавать новую открытую переменную на объекте, а прототипированная переменная будет недоступна.
  5. Статическая ( Static ) - объявляется с помощью Class.variableName или Class.functionName. Может изменяться любой функцией или методом. Такой метод используется редко.

Чтобы понять различия между уровнями, давайте рассмотрим пример:

function Cat(name, color){
  /*
  Конструктор: при создании объекта выполняется любой находящийся здесь код 
  */
  Cat.cats++;

  /* Скрытые переменные и функции доступны только скрытым или привилегированным 
  функциям. Отметим, что  'name' и 'color', переданные в Class, уже являются 
  скрытыми переменными.
  */

  var age  = 0;
  var legs = 4;
  function growOlder(){
    age++;
  }

  /*
  Открытые переменные доступны открыто или скрыто 
  */

  this.weight = 1;
  this.length = 5;

  /*
  Привилегированные функции доступны открыто или скрыто. 
  Могут обращаться к скрытым переменным.

  Невозможно изменить, можно только заменить открытой версией
  */

  this.age = function(){
    if(age==0) this.length+=20;

    growOlder();
    this.weight++;
  }
}

/*
Прототипированные функции доступны открыто 
*/
Cat.prototype = {
  talk:     function(){ alert('Meow!'); },
  callOver: function(){ alert(this.name+' ignores you'); },
  pet:      function(){ alert('Pet!'); }
}

/*
Прототипированные переменные доступны открыто.
Нельзя перезаписать, только заменить открытой версией 
*/

Cat.prototype.species = 'Cat';

/*
Статические переменные и функции доступны открыто 
*/

Cat.cats = 0;

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

< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Елена Сапегова
Елена Сапегова

После прохождения теоретической части пришло письмо об окончании теоретической части курса, будет ли практическая часть?

Рустам Рахимов
Рустам Рахимов

Пол часа искал в интеренете, как что работает. Такое чувство что автор пишет для людей которые уже знают js, или просто хвастается своими знаниями. Конструкция формы непонятна. И можно было бы в кратце написать, что такое событие которое используют. Сорершенно не понятно как работает форма, и как брать из нее значение. 

function Complete() {

    var x = "Имя: " + document.tutform.firstname.value;

alert(x);

} - Так брать значение из формы tutform, firstname-получаем значение из имени. 

<INPUT TYPE="button" VALUE="Готово" onClick="Complete();"> - Нужно к кнопке прописать событие, при нажатие на кнопку готово, чтобы возвращалось значение с помощью функции. А так ничего не работает, и смысла учить нету, если не знать почему не работает.

 

Константин Леденев
Константин Леденев
Россия
Олег Равков
Олег Равков
Россия