1

Тема: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Мені потрібно підраховувати кількість викликів метода в об'єкті. Я написав таку функцію.

function(){
  return {
    counter: 0,
    fn: function(){
      this.counter += 1;
      
      console.log(this.counter);
    }
  }
}

Якщо її запускати в консолі Google Chrome, то все чудово працює. Але коли намагаюсь виконати це в браузері через виклик URL, то видає NaN.

Трохи почитав за вказівник this, про те, що в залежності від контекста він вказує на різні значення.

Але я так і не зрозумів чи можна все таки написати метод об'єкта, який завжди коректно підраховуватиме кількість викликів не залежно від контекста, де він викликається. Ніхто не в курсі як це реалізувати?

2

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Дивно, в мене, як я і передбачав, кожного разу друкує 1. Можна весь код?

Ну і наївне рішення: завести в об’єкті counter, а в потрібному методі його збільшувати. Пробували?

Подякували: koala1

3

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

І як саме ви викликаєте " це в браузері через виклик URL"?

4

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

quez написав:

Дивно, в мене, як я і передбачав, кожного разу друкує 1. Можна весь код?

Ну і наївне рішення: завести в об’єкті counter, а в потрібному методі його збільшувати. Пробували?

Весь код:

angular.module('post.directive',[])

.directive('tagPercentage', function() {
  return {
    restrict: 'C',
    counter: 0,
    link: function(scope, tagElement, attrs) {
      this.counter += 1;
      console.log(this.counter);
      if( ! scope.tag.weight)
      {
        var count_el = scope.$parent.post.tags.length;
        var textPercentage = Math.round(100 / count_el) + "%";
        scope.tag.weight = textPercentage;
      }
      
      var tagClass = "base";
      
      tagElement
      .css("width", scope.tag.weight)
      .resizable({
        handles: 'e',
        distance: 5,
        start: function (event, ui)
        {
          this.widthWithNeighbor = ui.originalSize.width + ui.element.next().outerWidth();
          $(this).parent().addClass("resizing");
        },
        resize: function (event, ui)
        {

        },
        stop: function (event, ui)
        {
          delete this.widthWithNeighbor;
          $(this).parent().removeClass("resizing");
        }
      })
      .on('resize', function (event) {
          event.stopPropagation();
      });
        
    }
  };
})

Стосовно окремого методу, то до нього точно так само не зрозуміло (мені) як треба звертатись. Через this?

5

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Invader написав:

І як саме ви викликаєте " це в браузері через виклик URL"?

http://plnkr.co/edit/eAeEVgAxqKB7uymavpsA?p=preview

6

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Щодо наївного рішення: я думав, що у вас уже є об’єкт, в якому можна було б все це прописати. А у вас колбек, з якого повертається об’єкт, з яким незрозуміло що відбувається — Nan якось з’являється, хоча мала б виводитись кожного разу одиниця.

7

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

quez написав:

Щодо наївного рішення: я думав, що у вас уже є об’єкт, в якому можна було б все це прописати. А у вас колбек, з якого повертається об’єкт, з яким незрозуміло що відбувається — Nan якось з’являється, хоча мала б виводитись кожного разу одиниця.

Ні, не кожного разу, вище я дав URL робочого прикладу (див. консоль)

8 Востаннє редагувалося quez (25.01.2015 15:10:17)

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Ліл, я саме про це й писав. У вас є об’єкт samoVarsomeVar, весь час той самий. А приведений вище код кожного разу повертає новий.
Можете теж спробувати створити об’єкт, а потім зробити щось таке:

.directive('tagPercentage', function() {
    someVar.incr()
    //ще якісь дії, які мають виконуватись саме в цій функції
})

incr — це аналог fn з робочого коду.

9

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

quez написав:

Ліл, я саме про це й писав. У вас є об’єкт samoVarsomeVar, весь час той самий. А приведений вище код кожного разу повертає новий.

Звідки вам відомо, що створений об'єкт не викликається більше одного разу?... Але і то не важливо, бо він жодного разу не спрацьовує так як очікую.

10

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

ktretyak написав:
quez написав:

Ліл, я саме про це й писав. У вас є об’єкт samoVarsomeVar, весь час той самий. А приведений вище код кожного разу повертає новий.

Звідки вам відомо, що створений об'єкт не викликається більше одного разу?... Але і то не важливо, бо він жодного разу не спрацьовує так як очікую.

Дійсно, я не можу нічого стверджувати. Але в цьому логіка передачі функції як параметра — при певних умовах виконати дії, які хоче користувач (в цьому випадку створити об’єкт). Інакше, якщо результат виконання цієї функції зберігається і потім кожного разу йде звернення до цього об’єкта, то чому зразу не передавати об’єкт?

11

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

quez написав:
ktretyak написав:
quez написав:

Ліл, я саме про це й писав. У вас є об’єкт samoVarsomeVar, весь час той самий. А приведений вище код кожного разу повертає новий.

Звідки вам відомо, що створений об'єкт не викликається більше одного разу?... Але і то не важливо, бо він жодного разу не спрацьовує так як очікую.

Дійсно, я не можу нічого стверджувати. Але в цьому логіка передачі функції як параметра — при певних умовах виконати дії, які хоче користувач (в цьому випадку створити об’єкт). Інакше, якщо результат виконання цієї функції зберігається і потім кожного разу йде звернення до цього об’єкта, то чому зразу не передавати об’єкт?

Це називається "ліниве завантаження" (з області DI).

12 Востаннє редагувалося Invader (25.01.2015 18:10:25)

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Виведіть this за допомогою console.log (console.log(this)) для того щоб визначити контекст виконання. В мене в Firefox developer edition в консолі виводиться отаке:

Object { f: a.f() }

. В Pale moon такого не виводиться. Початковий код:

var a = {
    f:function(){
        console.log(this)
    }
}
a.f()

13

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Дякую за підказку, але таке я, звичайно ж, робив. У Google Chrome показує, що це об'єкт window.

Можна й до об'єкта windows підв'язати потрібну змінну, можна зробити зовнішній об'єкт та записувати значення лічильника туди, але мені цікаво це реалізувати, в першу чергу, саме зі змінною поточного об'єкта. Невже це не можливо в JS...

14

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Він  не має бути window. Або Chrome показує щось не те.
Прочитайте документацію по Angular. В jQuery у випадку з таким кодом

jQuery('form').submit(function(event) { alert(this);});

this звісно ж не буде вказувати на якийсь порожній об'єкт створений користувачем.

15

Re: Чи можна зробити лічильник викликів метода в об'єкті JS ?

Invader написав:

Він  не має бути window. Або Chrome показує щось не те.
Прочитайте документацію по Angular. В jQuery у випадку з таким кодом

jQuery('form').submit(function(event) { alert(this);});

this звісно ж не буде вказувати на якийсь порожній об'єкт створений користувачем.

Думаю швидше ви чогось не знаєте, ніж хром показує щось не те.

Я покищо замість this викликаю зовнішній метод, який повертає об'єкт з однією властивістю - counter, і таким чином вирішую проблему, але мені здається це костиль, а не рішення...