2014-09-28 1 views
0

В JavaScript я определил объект, как это:В объектно-ориентированном Javascript передать метод члена объекта в обработчик события

function myObject() { 
    this.x = 5; 
    window.addEventListener("resize", this.resizeHandler); 
} 

myObject.prototype.doSomething = function() { 
    alert(this.x); 
} 

myObject.prototype.resizeHandler = function() { 
    this.doSomething(); // Here occurs error. 
} 

var obj = new myObject(); 

Однако я бегу в сообщении об ошибке «Uncaught TypeError: не определено не является функцией» , Вопрос: «Почему?» Объяснение было бы здорово!

благодарит заранее.

+1

* «Объяснение будет замечательным!» * Объяснение заключается в том, что вы передаете функцию, а не объект. Функции сами по себе являются объектами и могут передаваться и ссылаться как любой другой объект. Из-за этого вы можете иметь несколько объектов, ссылающихся на одну и ту же функцию, или на объект, ссылающийся на него. Нет такой вещи, как объект «владелец». Поскольку значение 'this' в функции обычно основано на том, как эта функция вызывается, вам необходимо вызвать ее таким образом, чтобы вы, неявно или явно,« рассказывали »функции, каково ее значение« this ». – 2014-09-28 18:57:00

ответ

4

Вы должны убедиться, что контекст this правильно ...

function myObject() { 
    this.x = 5; 
    window.addEventListener("resize", this.resizeHandler.bind(this)); 
} 

myObject.prototype.doSomething = function() { 
    alert(this.x); 
} 

myObject.prototype.resizeHandler = function() { 
    this.doSomething(); // Here occurs error. 
} 

Здесь .bind(this) используется.

this Изменения в функции, используемые в качестве обработчика событий.

+1

Маленькая сноска: #bind не поддерживается в IE <9. Полиполя доступна здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility – Bart

+0

Спасибо, значит, это тоже ... :) – jcreamer898