Подтвердить что ты не робот

"this" ключевое слово в методах событий при использовании объекта прототипа JavaScript

Я пытаюсь получить доступ к переменным-членам класса прототипа в JavaScript в обработчике событий - то, что я обычно использовал для ключевого слова "this" для (или "этого" [копии этого] в случае обработчики событий). Излишне говорить, что у меня проблемы.

Возьмем, к примеру, этот фрагмент HTML:

<a id="myLink" href="#">My Link</a>

И этот код JavaScript:

function MyClass()
{
  this.field = "value"
  this.link = document.getElementById("myLink");
  this.link.onclick = this.EventMethod;
}

MyClass.prototype.NormalMethod = function()
{
  alert(this.field);
}

MyClass.prototype.EventMethod = function(e)
{
  alert(this.field);
}

Создание объекта MyClass и вызов NormalMethod работают точно так же, как я ожидаю (см. "Значение" ), но нажатие ссылки приводит к значению undefined, потому что ключевое слово "this" теперь ссылается на цель события (якорь() HTML).

Я новичок в стиле прототипа JavaScript, но в прошлом, с закрытием, я просто сделал копию "this" в конструкторе:

var that = this;

И затем я мог получить доступ к переменным-членам в методах событий через объект "тот". Это не похоже на прототип кода. Есть ли другой способ достичь этого?

Спасибо.

4b9b3361

Ответ 1

Иная ваша фраза "that=this" по-прежнему применима:

function MyClass()
{
    ...

    var that = this;
    this.link.onclick = function() {
        return that.EventMethod.apply(that, arguments);

        // that.EventMethod() works too here, however
        // the above ensures that the function closure
        // operates exactly as EventMethod itself does.

    };
}

Ответ 2

Вам нужно:

this.link.onclick = this.EventMethod.bind(this);

... 'bind' является частью Prototype и возвращает функцию, которая правильно называет ваш метод с 'this'.

Ответ 3

Вы должны попробовать

this.link.onclick = this.EventMethod.bind(this);

Ответ 4

Как указано выше, использование связывания, которое является частью библиотеки Prototype, является чистым способом решения этой проблемы. Этот вопрос является дубликатом другого вопроса SO, на который здесь отвечает реализация метода связывания без включения всей библиотеки прототипов:

fooobar.com/info/3485/...