den0820
@den0820
Фронтенд Junior разработчик.

Счетчик на нативном JS?

Здравствуйте. Суть вопроса в том, что я хотел бы реализовать функцию вызова счетчика на нативном js без скобок, то есть когда мы вызываем функцию, мы ведь указываем скобки, так как в противном случае она не выполнится. Например:
function makeCounter() {
var curent = 1;

return function() {
return current++;
}
};

var counter = makeCounter();
counter();
counter();

alert(counter()); // даст нам значение 3


Так вот можно ли организовать так, чтобы counter вызывался без скобок? Я также пробовал реализовать это с помощью конструктора:
function makeCounter() {
var curent = 1;
 return {
    get: function() {
      return curent++;
    }
}
};

var counter = new makeCounter();
counter.get();


Но и в таком случае конструкция еще больше усложняется. А я хотел бы получить просто вызов counter без скобок.
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
https://jsfiddle.net/QW01_01/w45v1hdc/1/
var makeCounter = function(counterName){
	var c = 0;

    Object.defineProperty(window, counterName, {
      enumerable: false,
      configurable: false,
      get:function(){
          return c++;
      }
    });

}

makeCounter('counter');

counter;
counter;
counter;

console.log(counter);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Можно проще.

function Counter () {
    var _counter = -1;
    return {
        valueOf: function () {
            _counter++;
            return _counter;
        }
    }
}

var cnt = new Counter();
alert(cnt);
alert(cnt);


Возможны варианты, но суть трюка в valueOf (иногда используют toString, но на самом деле нужен valueOf).
Ответ написан
Вам показали два основных варианта: использовать getter или переопределять valueOf/toString. Но такое неявное изменение объекта при каждом обращении может работать не так, как Вы этого ожидаете. Будьте аккуратны при использовании подобных "читерских" решений, и обязательно документируйте такой код. Если бы я увидел подобное в общедоступном коде, я бы расстроился :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы