Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КЛ_СЯП_защ.doc
Скачиваний:
7
Добавлен:
01.03.2025
Размер:
2.68 Mб
Скачать

8.3. Переменные 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;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]