Инициализация объекта JavaScript/ES5 с использованием конструктора с Getter/Setter
Следующая функция конструктора написана на JavaScript / ES5 -
function Range(from, to) {
function getFrom() { return from; }
function getTo() { return to; }
function setFrom(f) { from = f; }
function setTo(t) { to = t; }
Object.defineProperties(this, {
fromProp: { get: getFrom, set: setFrom, enumerable: true, configurable: false },
toProp: { get: getTo, set: setTo, enumerable: true, configurable: false }
});
};
Я создаю объект с помощью этого конструктора следующим образом -
var range = new Range(4, 13);
Мое общее понимание создания объекта заключается в том, что внутри конструктора должен быть какой-то код, который после создания экземпляра объекта range
, будет инициализировать fromProp
а также toProp
со значениями, которые я передал через параметры конструктору. Но мне трудно понять, как именно это происходит здесь.
Или все вещи "инициализации / доступа к свойствам" здесь захвачены при закрытии вызова setter / getter? Но если так, то в любое время, когда я использую -
range.fromProp = 22;
значение 22 фактически никогда не устанавливается в range
собственность объекта fromProp
, а скорее к переменной параметра from
и затем всякий раз, когда я спрашиваю -
var fromValue = range.fromProp;
он просто передает мне текущее значение переменной параметра from
, Я правильно понял или что-то упустил?
Любое объяснение по этому вопросу?
2 ответа
Если вы из мира Java/C#, то это, конечно, на первый взгляд кажется немного странным, потому что в этих языках любые значения, передаваемые через параметры конструктора, обычно используются для инициализации объекта, то есть для сохранения значений как внутреннего состояния объекта., которые обычно представлены с закрытыми полями.
Затем эти закрытые поля открываются для внешнего мира через свойства с помощью getter/setter.
Таким образом, метод получения / установки в этих языках фактически инкапсулирует внутренние данные объекта, а не параметры конструктора.
С другой стороны, JavaScript не дает возможности сделать состояние своего объекта приватным.
Вот почему значения параметров конструктора здесь не были сохранены в каких-либо свойствах данных, и, скорее, они фиксируются при закрытии вызова свойств средства доступа (как упомянуто в комментариях) для имитации частного состояния объекта.
function Range(from, to) {
function getFrom() { return from; }
function getTo() { return to; }
function setFrom(f) { from = f; }
function setTo(t) { to = t; }
Object.defineProperties(this, {
fromProp: { get: getFrom, set: setFrom, enumerable: true, configurable: false },
toProp: { get: getTo, set: setTo, enumerable: true, configurable: false }
});
};
Давайте разберем здесь, вы устанавливаете свойство "get" для "fromProp" как ссылку на функцию "getFrom", где вы возвращаете значение параметра "from", и точно так же, как "set" ссылается на функцию "setFrom" "где присваивается значение" from ".
Как вывод, get и set fromProp не содержат непосредственно значение, а содержат функцию доступа для возврата значения from.
Надеюсь, что ваши сомнения теперь ясны.