Зачем использовать функцию «get» для счетчиков javascript? - PullRequest
1 голос
/ 13 января 2020

Мне показалось, что я понял назначение функций get и set в методах доступа. Но в учебнике (W3Schools) они приводят этот пример. Обратите внимание, что первые три get, а последние два set. Почему они не все set, если мы пытаемся мутировать counter?

// Define an object
var obj = {counter:0};

// Define Setters and Getters
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (value) {this.counter -= value;}
});

Ответы [ 3 ]

2 голосов
/ 13 января 2020

set требует значения в правой части оператора =.

obj.add = 5

get вообще не требует = и, следовательно, никакого другого значения.

obj.increment

Тем не менее, это очень надуманный пример. Если ваши имена получателей и установщиков являются глаголами, вы, вероятно, просто хотите, чтобы они были функциями.

2 голосов
/ 13 января 2020

Причина, по которой set используется в методах сложения и вычитания, заключается в том, что они принимают аргумент функции, тогда как приращение и убывание - нет. По определению, получатели не принимают аргументы, а установщики. Технически они могли бы использовать set с приращением и уменьшением, но на самом деле это не имеет большого значения, и, честно говоря, я не вижу большого количества людей, использующих методы получения / установки для начала.

Вот пост переполнения стека , объясняющий больше различий между set / get с аргументами

2 голосов
/ 13 января 2020

Здесь дело не в мутировании / не в мутировании, а скорее в необходимости передачи аргумента (set - справа от оператора =) или нет (get). Если вы посмотрите на пример, приведенный W3Schools:

// Play with the counter:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;

, вы заметите, что add и subtract («сеттеры») имеют аргументы (5 и 1), тогда как reset / increment / decrement не имеет аргументов ("получателей").

...