如何从JavaScript中的同一对象中的另一个方法调用方法?

时间:2011-08-23 00:52:20

标签: javascript jquery oop

我刚刚开始使用OO javascript,所以请耐心等待。

这有效:

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

但是,如果我在“foo”方法中的hello警告之后执行其他操作,那么“this”的含义会从对象更改为我上次选择的任何内容,因此使用this.bar()不执行其他方法在课堂里。

所以我试着在这样的变量中缓存“this”:

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

但这也不起作用。那么解决方案是什么?

修改

这是我的实际代码:

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 个答案:

答案 0 :(得分:5)

正如我在评论中所说,你必须在函数中保留一个引用:

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所指的内容取决于如何调用一个函数,每个函数都有自己的thisMozilla documention描述this更详细)。

如果您使用validate致电formObj.validate(),则this会引用formObj

jQuery documentation for each声明:

  

更重要的是,回调是在当前DOM元素的上下文中触发的,因此关键字this引用该元素。

答案 1 :(得分:2)

我错过了什么,或者你不能只是按名称引用对象,如下所示:

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

myObj.foo();

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

答案 2 :(得分:0)

函数的关键字由调用设置,在函数执行期间不能更改。

调用obj.foo() foo 设置为 obj ,以便调用 this.bar 调用 obj.bar 。但是,如果您以其他方式调用 foo ,例如:

var a = obj.foo;
a();

然后它的这个可能是 obj (在上面的例子中它将是 window undefined in严格模式)如果对象没有 bar 属性,您将获得不同的 bar 或错误。