Инициализация объекта JavaScript / ES5 с использованием конструктора с Getter / Setter - PullRequest
0 голосов
/ 06 июля 2018

Следующая функция конструктора написана на 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 фактически никогда не устанавливается равным fromProp свойству объекта range, а вместо этого - переменной параметра from, а затем всякий раз, когда я спрашиваю -

var fromValue = range.fromProp;

он просто передает мне текущее значение переменной параметра from. Я правильно понял или что-то упустил?

Есть объяснения по этому поводу?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Если вы из мира Java / C #, то это, конечно, кажется на первый взгляд немного странным, потому что в этих языках любые значения, передаваемые через параметры конструктора, обычно используются для инициализации объекта, то есть для сохранения значений в виде внутреннее состояние объекта, которое обычно представлено частными полями.

Затем эти закрытые поля открываются для внешнего мира через свойства с помощью getter / setter.

Таким образом, метод получения / установки в этих языках фактически инкапсулирует внутренние данные объекта, а не параметры конструктора.

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

Именно поэтому значения параметров конструктора здесь не были сохранены в каких-либо свойствах данных, а, скорее, записываются при закрытии вызова свойств средства доступа (как упомянуто в комментариях) для имитации частного состояния объекта.

0 голосов
/ 06 июля 2018
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.

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

...