0

Допустим, существует класс:

function MyClass {
   self = this; // Создаст глобальный объект self
   $(document).ready(this.g);
}

MyClass.prototype.g = function(event) { 
   // здесь this - это объект вызывавший событие.
   // обращаемся к полям класса через self
}

Но self - это глобальный объект, если мы таким же образом определим другой класс, с таким же self, то он собъет self текущего.

Я вижу решение только в выдаче каждому объекту своего id и обращению к ним через глобальный массив в функциях подобным g.

Существуют другие способы обойти это?

YpaHeL1
  • 1,188

2 Answers2

1
$(document).ready((e) => this.g(e));

или

this.bound_g = this.g.bind(this);
$(document).ready(this.bound_g);

тогда

MyClass.prototype.g = function(event) { 
   // здесь this - это объект MyClass 
}

Другой вариант:

var self = this;
$(document).ready(function(event) { 
  self.g(this, event);
});

MyClass.prototype.g = function(element, event) { 
   // здесь this - это объект MyClass 
}
  • В моём классе используются как unbind, так и removeEventListener, так не получится, к сожалению. – YpaHeL1 Jan 24 '19 at 22:26
  • @OlegUP я не понимаю, что Вы хотите сказать –  Jan 24 '19 at 22:32
  • нельзя использовать анонимные функции, если поведением в коде заложено удаление обработчиков событий. https://learn.javascript.ru/introduction-browser-events#addeventlistener-i-removeeventlistener – YpaHeL1 Jan 24 '19 at 22:39
  • @OlegUP хм, ну сохраните результат this.g.bind(this) в свойство объекта, прежде чем назначать обработчик события –  Jan 24 '19 at 22:43
1
$(document).ready(this.g);
$(document).ready(this.g.bind(this));

В моём классе используются как unbind, так и removeEventListener, так не получится, к сожалению.

constructor() {
  this.g = this.g.bind(this);
}

doSmth() {
  $(document).ready(this.g);
}
Qwertiy
  • 123,725
  • выполняя присваивание в this.g потеряется преимущества класса на прототипах? – YpaHeL1 Jan 24 '19 at 23:08
  • @OlegUP, если ты о моём варианте (а не о присваивании лямбды в конструкторе вместо прототипного метода) возможность перекрывать методы в наследниках и экономия памяти на функциях сохранятся, а возможность динамически изменять и создавать методы для уже созданных объектов потеряется. – Qwertiy Jan 24 '19 at 23:20
  • этого достаточно, спасибо, не помешал бы конечно, ещё, источник где говорится о структуре класса при такой практике. Я проверю это сейчас, и в случае успеха отмечу ваш ответ как верный. – YpaHeL1 Jan 25 '19 at 10:22
  • http://bit.ly/2SarUwc Здесь я присваиваю результат bind в __proto__, только тогда эта функция будет одна для всех объектов. присваивание же в this без __proto__ будет создавать отдельную функцию в каждом экземпляре. – YpaHeL1 Jan 25 '19 at 12:38
  • @OlegUP, где ты в моём коде нашёл __proto__? Функция в прототипе. В каждый экземпляр попадает своя функция, которую вернёт bind. – Qwertiy Jan 25 '19 at 22:20