Геттеры и сеттеры встречаются во многих популярных языках программирования:
- Java,
- JavaScript,
- PHP,
- C,
- и др.
Где бы ни использовались геттеры и сеттеры, у них одна цель — защитить содержимое ваших скриптов, когда ими пользуется кто-нибудь другой.
Геттеры и сеттеры
Геттеры и сеттеры — это методы доступа, которые помогают вам управлять доступом к различным переменным в коде. В скриптах они пишутся так:
- get (он же геттер) — применяется для чтения переменной;
- set (он же сеттер) — применяется для записи переменной.
Чтобы лучше понять, как работают геттеры и сеттеры, нужно показать это на примере.
Геттеры и сеттеры для кваса
Итак, представим, что у нас есть собственная квас-машина наподобие кофе-машины, только с пивом:
function KvassMachine(power) {
//определяем, сколько кваса в нашей машине
this.kvassAmount = 0
...
}
Вроде бы все хорошо, в нашей квас-машине пока просто нет кваса, и мы можем в нее залить этот божественный прохладный напиток. Но на самом деле «kvassAmount» является общедоступным, а это значит, что в него кто угодно может залить сколько угодно кваса, а может, даже несколько человек сразу. В результате у нас может получиться что-то такое:
//Наша квас-машина столько литров кваса не вместит!
kvassMachine.kvassAmount = 100000;
Но и это еще не все. Может получиться так, что кваса выпьют больше, чем вмещает наша квас-машина, например:
//никого не тревожит, что наша квас-машина вмещает всего 50 литров кваса, все просто подходят и пьют
kvassMachine.kvassAmount = -100000;
«Почему такой бардак с квасом происходит?» — спросите вы. А все потому, что объем нашей квас-машины доступен снаружи и абсолютно всем. Абсолютно любой может к ней обратиться и добавить или взять кваса столько, сколько захочет. Для того чтобы такого не происходило, необходимо задать ограничение на использование нашей квас-машины со стороны остальных «любителей кваса».
Обычно контролировать в таких ситуациях можно при помощи приватного свойства, а записывать нужное значение при помощи сеттера. В нашем варианте это будет «setKvassAmount». Например:
function KvassMachine(power, volume) { // volume — это объем нашей квас-машины
var kvassAmount = 0;
var KVASS_COOL_VOLUME = 50;
function getTimeToBoil() {
return Amount * KVASS_HEAT_VOLUME * 40 / power;
}
// останавливаем квас-машину "с умом"
this.setkvassAmount = function(amount) {
if (amount< 0) {
throw new Error("Не может быть отрицательного значения");
}
if (amount > volume) {
throw new Error("Невозможно наливать большее количество кваса, чем " + volume);
}
kvassAmount = amount;
};
function onReady() {
alert( 'Охлажденный квас!' );
}
this.run = function() {
setTimeout(onReady, getTimeToBoil());
};
}
var kvassMachine = new KvassMachine(100, 50);
kvassMachine.setkvassAmount(500); // вот вам и ошибка!
Ошибка произошла, потому что «kvassAmount» — это внутреннее свойство, которое можно «переписать», но пока невозможно «считать». Чтобы у внешних «любителей кваса» была возможность узнавать значение нашего свойства, нужно воссоздать особую функцию — геттер. В нашем случае это будет getKvassAmount. Например:
function KvassMachine(power, volume) {
//...
this.setKvassAmount = function(amount) {
if (amount< 0) {
throw new Error("Не может быть отрицательного значения");
}
if (amount > volume) {
throw new Error("Невозможно наливать большее количество кваса, чем " + volume);
}
kvassAmount = amount;
};
this.getKvassAmount = function() {
return kvassAmount;
};
}
var kvassMachine = new KvassMachine(100, 50);
kvassMachine.setKvassAmount(500);
alert( kvassMachine.getKvassAmount() ); // 500
Заключение
Геттеры и сеттеры призваны помочь контролировать переменные от внешнего вмешательства. А вам, в свою очередь, дают возможность безопасно читать и менять значения самой переменной.
Другое