Как вызвать метод из другого метода в том же объекте в JavaScript? - PullRequest
5 голосов
/ 23 августа 2011

Я только начинаю в OO javascript, поэтому, пожалуйста, потерпите меня.

Это работает:

var myObj = {
     foo : function() {
            alert('hello');
            this.bar();
     },
     bar: function() {
            alert('world');
     }
}

Однако, если я сделаю некоторые другие вещи после предупреждения hello в методе "foo", то значение "this" изменится с объекта на то, что я выбрал последним, поэтому использование this.bar() не выполнит другой метод в учебный класс.

Итак, я попытался кешировать «this» в переменной следующим образом:

var myObj = {
     publicVars: {
            theObj : this
     },
     foo : function() {
            alert('hello');
            publicVars.theObj.bar();
     },
     bar: function() {
            alert('world');
     }
}

Но это тоже не сработало. Так в чем же решение?

EDIT

Вот мой фактический код:

var formObj = {

     validate : function(theForm) {
            $('input, textarea', theForm).each(function() {
                 var valueLength = $(this).val().length;
                 if (valueLength === 0) {
                        $(this).addClass('invalid');
                        this.listenForInput($(this)); // <!------- this isn't working
                 }
            });
     },
     listenForInput : function(theField) {
//          theField.keyup(function() {
//               if ($(this).val().length > 0) {
//                      theField.removeClass('invalid');
//               }
//          });
            alert('I work!!!!');
     }

} // end obj

Ответы [ 3 ]

5 голосов
/ 23 августа 2011

Как я уже сказал в своем комментарии, вы должны сохранить ссылку внутри функции:

validate: function(theForm) {
    var self = this;
    $('input, textarea', theForm).each(function() {
        var valueLength = $(this).val().length;
        if (valueLength === 0) {
           $(this).addClass('invalid');
           self.listenForInput($(this));
        }
    });
},

Вы передаете функцию в each.Внутри этого обратного вызова this относится к элементу DOM.Вот почему вы передаете его в jQuery ($(this)), чтобы иметь возможность вызывать методы jQuery для этого элемента.Он также не может ссылаться на formObj!


То, на что ссылается this, определяется как вызывается функция, и каждая функция имеет свой собственный this ( Документация Mozilla описывает this более подробно).

Если вы звоните validate с formObj.validate(), то this относится к formObj.

.Документация jQuery для each гласит:

Что более важно, обратный вызов запускается в контексте текущего элемента DOM, поэтому ключевое слово this относится к элементу.

2 голосов
/ 23 августа 2011

Я что-то упустил, или вы не можете просто ссылаться на объект по имени, например:

var myObj = {
    foo: function() {
        alert('hello');
        myObj.bar();
    },
    bar: function() {
        alert('world');
    }
}

myObj.foo();

http://jsfiddle.net/karim79/kaXYj/

0 голосов
/ 23 августа 2011

Ключевое слово этой функции устанавливается вызовом, оно не может измениться во время выполнения функции.

Вызов obj.foo() устанавливает foo 's this to obj с таким вызовом this.bar вызывает obj.bar .Однако, если вы позвоните foo другим способом, например:

var a = obj.foo;
a();

, тогда его this может быть obj (в приведенном вышеесли это будет окно или неопределенное в строгом режиме), поэтому вы получите другой бар или ошибку, если этот объект не 'свойство bar .

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