2009-03-30 2 views
4

Я создал класс следующим образом:метод класса не может получить доступ к свойствам

function MyClass() 
{ 
    var myInt = 1; 
} 

MyClass.prototype.EventHandler = function(e) 
{ 
    alert(this.myInt); 
} 

К сожалению, this является инициируемого событием (в моем casss тег), и я не могу получить доступ к свойствам класса ,

Любые предложения?

ответ

4

Это зависит от того, как вы передаете обработчик событий при регистрации события.

Следующий код

element.addEventListener("click", myObject.EventHandler); 

не будет делать то, что вы хотите.

Javascript не обрабатывает делегатов, таких как C#, например, поэтому myObject.EventHandler не является методом EventHandler, вызываемым для myObject.

Если вы хотите вызывать метод объекта как обработчик события, лучше всего включить его в функцию.

element.addEventListener("click", function(event) 
{ 
    myObject.EventHandler(event); 
}); 
+0

Спасибо за ответ, хотя мне пришлось немного его подстроить: , связанное с событием, было сделано внутри области действия класса (myObject), поэтому myObject.EventHandler неизвестен. Вместо этого перед добавлением события я добавил к элементу свойство с 'this' (element.myObj = this); , и теперь я могу получить доступ к объекту – Amir

2

На самом деле у JavaScript нет классов. MyClass - конструктор объекта, прототипом которого является объект MyClass.prototype.

Ключевое слово this может ввести в заблуждение для понимания; его значение в функции зависит от того, какой объект называется функцией как свойство.

Если вы хотите, чтобы иметь возможность вызвать метод объекта из обработчика события, вы должны использовать функцию закрытия, как предлагает Винсент Роберт.

Я предлагаю вам проверить эти ссылки для получения дополнительной информации о this:

Кроме того,

function MyClass() 
{ 
    var myInt = 1; 
} 

Этот конструктор устанавливает локальную переменную внутри функция, недоступная извне функции. Если вы хотите инициализировать свойство объекта, вам необходимо использовать this.myInt = 1. Однако это значение будет установлено только для объектов, построенных с помощью new MyClass(), но не для самого объекта функции MyClass.

4

«vars», объявленный в функции конструктора, не будет доступен для других публичных функций, они считаются «частными членами».

Вы можете использовать this.myInt = 1 сделать публичным и доступным для всех методов класса:

function MyClass(){ 
    this.myInt = 1; // Public member 
} 

MyClass.prototype.EventHandler = function(e){ 
    alert(this.myInt); 
} 

или вы могли бы иметь «привилегированный» метод, чтобы получить доступ к элементу «частное» на конструктор сферы:

function MyClass(){ 
    var myInt = 1; // Private member 

    this.getMyInt = function(){ // Public getter 
     return myInt; 
    } 
} 

MyClass.prototype.EventHandler = function(e){ 
    alert(this.getMyInt()); 
} 

Рекомендуемая лекция: Private Members in JavaScript (Дуглас Крокфорд)

+0

, но не будет ли этот объект ссылаться на тег , когда будет вызвана функция EventHandler? – Amir

0

Предполагая, что вы замените var myInt на this.myInt, вы можете ссылаться на него как MyClass.myInt с точностью до MyClass.prototype.EventHandler, не беспокоясь о том, что означает this.

Смежные вопросы