После прохождения теоретической части пришло письмо об окончании теоретической части курса, будет ли практическая часть? |
Опубликован: 19.10.2006 | Уровень: для всех | Доступ: платный
Лекция 8:
Основы объектно-ориентированного программирования
Переменные Private, Public и Static
Способ определения переменных в объекте определяет, какие методы этого объекта можно использовать для доступа к этим переменным. В JavaScript при работе с объектно-ориентированным кодом используется пять уровней методов и свойств.
- Скрытая ( Private ) - объявляется с помощью var variableName или function functionName внутри объекта. Могут быть доступны только другим скрытым или привилегированным функциям.
- Открытая ( Public ) - объявляется с помощью this.variableName внутри объекта. Может изменяться любой функцией или методом.
- Привилегированная ( Privileged ) - объявляется с помощью this.functionName = function(){ ... } внутри объекта. Доступна для любой функции или метода и может обращаться или изменять любую скрытую переменную.
- Прототипированная ( Prototype ) - объявляется с помощью Class.prototype.variableName или Class.prototype.functionName. Объявленные таким образом функции будут иметь доступ к любой открытой или прототипированной функции. Попытки изменить созданную таким образом переменную будут вместо этого создавать новую открытую переменную на объекте, а прототипированная переменная будет недоступна.
- Статическая ( 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;
Мы видим, что существует несколько уровней доступа. Как было сказано ранее, все скрытые, привилегированные и открытые функции и переменные копируются всякий раз, когда создается новый экземпляр объекта. Обычно почти все, что нужно сделать, можно реализовать с помощью прототипированных и открытых переменных. В связи с этим обычно лучше избегать использования скрытых, привилегированных и статических переменных, если это не требуется специально.