Как получить доступ к свойству экземпляра в методе экземпляра, когда метод передается в другую функцию? - PullRequest
4 голосов
/ 06 мая 2011

Я знаю, что в коде ниже он напечатает undefined, если я нажму на кнопку, потому что this.field становится внутри контекста кнопки, а не Container.У меня вопрос, как я могу получить доступ к this.field из Container, когда this.func передается в другую функцию, которая отличается от контекста контекста, чем Container.

function Container(){
    this.field = 'field';

    $('button').click(this.func);
}

Container.prototype.func = function(){
   console.log(this.field);
}

Я знаю, что могу это сделать, но есть ли лучший способ?Потому что я бы лучше определил методы вне конструктора, чтобы не загромождать его.

function Container(){
    var thisObj = this;
    this.field = 'field';

    $('button').click(function(){ console.log(thisObj.field) });
}

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

Как насчет передачи анонимной функции?

function Container(){
    this.field = 'field';
    var self = this;

    $('button').click(function() {
        self.func()
    });
}

У вас здесь не так много вариантов ...

jQuery делает его немного проще для вас и предлагает $.proxy:

 $('button').click($.proxy(this.func, this));
 // or
 $('button').click($.proxy(this, 'func'));
1 голос
/ 06 мая 2011

Передать ссылку на объект в качестве данных события:

function Container(){
    this.field = 'field';

    $('button').click(this, this.func);
}

Container.prototype.func = function(e){
   console.log(e.data.field);
}

Смотрите здесь: http://jsfiddle.net/gilly3/nwtqJ/

0 голосов
/ 06 мая 2011

Я просто хотел бы отметить, что, вообще говоря, вам следует избегать думать о переменной this, которая имеет какое-либо сходство с переменной в java. Вы четко понимаете это, но это всегда стоит повторить. Так как javascript всегда указывает на объект, для которого вы вызвали функцию, передача вами функции экземпляра другому объекту для использования в качестве его щелчка приводит к путанице. Я не знаю, что вы намереваетесь делать в самом методе экземпляра, но нет причины, по которой обработчик onclick должен быть методом экземпляра другого объекта. Если это доступ к нужным членам, они общедоступны, поэтому не нужно, чтобы это был метод экземпляра. Если выполняемая работа относится исключительно к объекту Container, тогда onclick, возможно, должен быть отдельной функцией, которая будет иметь ссылку на контейнер и вызывать метод экземпляра.

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