MyTetra Share
Делитесь знаниями!
Классы в Java Script: Protected и Private - создание защищенных членов класса
Время создания: 05.05.2013 09:50
Текстовые метки: JavaScript, protected, private, свойство, метод, класс
Раздел: Компьютер - Программирование - Java Script - Классы в JavaScript
Запись: xintrea/mytetra_syncro/master/base/1367733033fxc38s1d4d/text.html на raw.github.com

Вначале нужно объяснить, что значит private и protected. Для объяснения опишем аналогичные модификаторы доступа из языка C++:


  • public – Модификатор доступа, который обозначает, что программист будет использовать элемент внутри класса, либо обращаться напрямую из других мест программы (через ссылка_на_объект->элемент) из других частей программы, и может использовать этот элемент в других классах.
  • private - Модификатор доступа, обозначает, что программист будет использовать соответствующие элементы только внутри своего собственного класса
  • protected – Модификатор доступа, который определяет, что программист собирается применить наследование. В наследуемых классах он собирается унаследовать такие элементы, которые должны срабатывать как элементы private, но в отличии от private они расплодятся по всем наследникам и каждый такой элемент будет соответствовать только своему классу


Исходя из этого описания видно, что члены класса с доступом Private и Protected доступны только в пределах класса (или в пределах класса-наследника). Извне такие свойства/методы недоступны. Попытка вызова из внешннего кода Private или Protected свойств/методов будет приводить к ошибке.



Private-члены в JavaScript


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


Пример:


function Animal(name, walkSpeed) {

// Объявляется приватная переменная

var speed = walkSpeed;

// Объявляется открытая переменная

this.distance = 0;

// Открытый метод, использующий private переменную speed

this.walk = function(time) {

this.distance = this.distance + time*speed;

}

}


Следует помнить об особенности JavaScript, вытекающей из прототипного наследования. При объявлении свойств и методов в качестве Private, они записываются не в прототип объекта, а в сам объект.


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


Примечание: Тут нужно разбираться дальше. К переменным, объявленным через var variableName; можно обратиться через this.variableName. Я встречал ситуации, когда обратиться просто по имени к переменным, объявленным через var, невозможно (при реализации синглтона).



Protected члены в JavaScript


Если Вы использовали ООП в других языках программирования, то наверняка знаете, что чаще делаются не private свойства, а protected, т.е такие, к которым могут получить доступ наследники. Javascript не предоставляет синтаксиса для создания protected свойств, поэтому их просто помечают подчеркиванием в начале.


function Animal(name) {

var privateVariable = 0

this._protectedName = name

this._protectedMethod = function(..) {

... alert(privateVariable)..

}

this.publicMethod = function() { ... }

}



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


Ограничение доступа к таким "защищенным" свойствам не жесткое и остается на совести программиста.



Материалы по теме: http://javascript.ru/tutorial/object/inheritance



 
MyTetra Share v.0.59
Яндекс индекс цитирования