Использование геттеров/сеттеров в JavaScript [дубликат]

113
02 октября 2019, 07:10

Данный вопрос является точным дубликатом:

  • Ошибка при выводе данных JavaScript [дубликат]

Есть такой код, нашел в книге по js. В этом примере нет ошибок. все выводится как надо и выводится 450

'use strict';
function CoffeeMachine(power, capacity) {
    var waterAmount = 0;
    this.waterAmount = function(amount) {
        if(!arguments.length)
            return waterAmount;
        if(amount < 0) {
            throw new Error('Значение должно быть положительным!');
        }
        if(amount > capacity) {
            throw new Error('Значение не должно быть больше ' + capacity);
        }
        waterAmount = amount;
    };
}
var coffeeMachine = new CoffeeMachine(1000, 500);
coffeeMachine.waterAmount(450);
alert(coffeeMachine.waterAmount());

Но в этом примере выводится undefined

'use strict';
 function CoffeeMachine(power, capacity) {
        var waterAmount = 0;
        this.waterAmount = function(amount) {
            if(!arguments.length)
                return waterAmount;
            if(amount < 0) {
                throw new Error('Значение должно быть положительным!');
            }
            if(amount > capacity) {
                throw new Error('Значение не дожно быть больше ' + capacity);
            }
            waterAmount = amount;
        };
    }
    var coffeeMachine = new CoffeeMachine(1000, 500);
    alert(coffeeMachine.waterAmount(450));

Тут я просто в alert записал сразу и все. объясните в чем разница, почему когда не в alert записано то все работает, а наоборот нет.

Answer 1
// вызов без параметров - getter - возвращает текущее значение
var a1 = coffeeMachine.waterAmount();
// вызов с параметром - setter - ничего не возвращает 
var a2 = coffeeMachine.waterAmount(123);
console.log(a1, a2);

Можете написать

    this.waterAmount = function(amount) {
        if(!arguments.length)
            return waterAmount;
        ...
        return waterAmount = amount;
    };

Тогда setter будет возвращать новое значение.

Answer 2

смотри ..у тебя происходит следующее- при первом вызове

coffeeMachine.waterAmount(450); 

у тебя функция ничего не отдает так как не выполняются условия в if : первый if
!arguments.length - будет true если не будет у метода waterAmount аргументов.. а больше ретурнов и нет. поэтому метод ничего не возвращает. но метод записывает значение

waterAmount = amount

и при следующем вызове его без параметров выполнится первый if и будет возвращено значение 450. отсюда и такое поведение. что бы он сработал в alert - вызови метод с аргументом, а в алерте уже без.

READ ALSO
Приходит пустой POST запрос

Приходит пустой POST запрос

Собираю Json и отправляю так:

163
Графики chart.js

Графики chart.js

У меня вопрос на понимание библиотеки chartjs

108
Как изменить скорость смены спрайтов canvas html5

Как изменить скорость смены спрайтов canvas html5

Моя задача сделать анимацию из спрайтов, они разбиты по на разные png, и я сделал чтобы спрайты менялись, но скорость смены этих спрайтов бешенаяПодскажите...

137
Как вставить курсор в нужное место?

Как вставить курсор в нужное место?

При клике на кнопку, в блок (с атрибутом contenteditable) помещается имя и оборачивается в элемент b и надо потом печатать после имени, если кликнуть...

114