В отличие от JAVA, в Javascript нет концепции приватного и общедоступного для свойств или методов. Давайте создадим объект с именем person, который имеет 2 свойства firstName и lastName, а также создадим 2 функции, которые будут геттерами для наших свойств. В Javascript мы можем создавать функции как свойства объектов, и эти функции доступны, как и любое другое свойство в любом месте.
var person={
"firstName":"Anoop",
"lastName":"Rai",
"getFirstName":function(){
return this.firstName;
},
"getLastName":function(){
return this.lastName;
}
};
console.log(person.getFirstName());
console.log(person.firstName);
Как и ожидалось выше, коды 11 печатают Anoop и Anoop. Хм, это не очень хорошо для объектно-ориентированного программирования. Что ж, мы успешно реализовали геттеры, и поэтому у нас также должны быть сеттеры, которые должны быть общедоступными, а свойства должны быть помечены как частные (что??? эти частные и общедоступные концепции принадлежат языкам, подобным JAVA, C++). У нас хорошие намерения, давайте применим концепции, характерные для Javascript. Мы не хотим делать person.firstName, мы хотим предотвратить прямой доступ к свойству. В таких языках, как JAVA, из-за приватного и общедоступного мы добились контролируемого доступа к свойствам, но в Javascript все общедоступно.
Javascript использует концепцию замыканий для реализации таких вещей, как частные и общедоступные. Этот шаблон называется шаблоном модуля. То есть скрытие переменных от публичного доступа. Чтобы реализовать области видимости, оберните свои коды в функции (помните, области видимости реализуются через функции в Javascript).
function createPerson(){
var returnObj={
"firstName":"Anoop",
"lastName":"Rai",
"getFirstName":function(){
return this.firstName;
},
"getLastName":function(){
return this.lastName;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
console.log(person.firstName);
Теперь также над строками печатает Anoop и Anoop. До сих пор нет успеха. Пока свойства привязаны к объекту, доступ к ним будет осуществляться напрямую. Давайте развяжем его. Вместо свойств делаем переменные области видимости функции (переменные замыкания).
function createPerson(){
var firstName="Anoop";
var lastName="Rai";
var returnObj={
"getFirstName":function(){
return firstName;
},
"getLastName":function(){
return lastName;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
console.log(person.firstName);
Теперь над строками печатается Anoop и undefined. Как это произошло? Из-за замыканий, когда были созданы функции getFirstName и getLastName, функции имели всю цепочку областей действия или указатели на соответствующие переменные, т. е. firstName и lastName. Объект returnObj не запоминает переменные, но функциональные объекты помнят из-за замыканий. Похоже, мы добились того, чего хотели, но осталось одно — сеттеры для контролируемого доступа к firstName и lastName. Давайте реализуем сеттеры.
function createPerson(){
var firstName="Anoop";
var lastName="Rai";
var returnObj={
"getFirstName":function(){
return firstName;
},
"getLastName":function(){
return lastName;
},
"setFirstName":function(name){
return firstName=name;
},
"setLastName":function(name){
return lastName=name;
}
};
return returnObj;
}
var person=createPerson();
console.log(person.getFirstName());
person.setFirstName("Kumar");
console.log(person.getFirstName());
Мы успешно изменили firstName, но контролируемым образом.
http://jkoder.com/the-module-pattern-javascript-way-of-hiding-data-in-objects-from-public-access/
person
Anoop Rai
schedule
01.09.2016