Инициализация объекта 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.

Надеюсь, что ваши сомнения теперь ясны.

Другие вопросы по тегам