Метод класса не может получить доступ к свойствам - PullRequest
4 голосов
/ 30 марта 2009

Я создал такой класс:

function MyClass()
{
    var myInt = 1;
}

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

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

Есть предложения?

Ответы [ 4 ]

4 голосов
/ 30 марта 2009

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

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

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

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

или у вас может быть метод " привилегированный " для доступа к члену " private " в области конструктора:

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

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

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

Рекомендуемая лекция: Приватные члены на JavaScript (Дуглас Крокфорд)

4 голосов
/ 30 марта 2009

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

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

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

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

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

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

element.addEventListener("click", function(event)
{
    myObject.EventHandler(event);
});
2 голосов
/ 30 марта 2009

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

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

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

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

Кроме того,

function MyClass()
{
    var myInt = 1;
}

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

0 голосов
/ 30 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...