【问题标题】:How to call a method from another method within the same object in JavaScript?如何在 JavaScript 中从同一对象中的另一个方法调用方法?
【发布时间】:2011-11-01 14:01:06
【问题描述】:

我刚刚开始使用 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

【问题讨论】:

  • 什么是“其他东西”,因为它不应该在那个对象内部改变。
  • 你说的“其他东西”是什么?如果您正在创建回调,那么this 将引用window(很可能)。在这种情况下,您只需首先在 foo 内创建对 this 的引用。
  • 我在编辑中发布了我的实际代码。请看一看。
  • 关于您更新的代码,您似乎希望this 引用您的formObj,同时引用DOM 元素。那是不会发生的。 this.listenForInput($(this));

标签: javascript jquery oop


【解决方案1】:

正如我在评论中所说,您必须在函数内保留引用:

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)。

如果您用formObj.validate() 调用validate,那么this 指的是formObj

jQuery documentation for each 声明:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的工作,不知道你可以通过它的名字来引用一个对象。所有教程都使用“this”关键字,上面的人说“this”的含义永远不会改变。但这对我有用,所以不确定那里发生了什么,但是是的,这行得通,谢谢。
    • 虽然这是一个修复,但我建议接受@Felix Kling 的回答,我认为它更适合这种情况。在撰写本文时,我还没有完全理解您的问题的上下文,因为您没有添加您的实际实现。
    【解决方案3】:

    函数的this关键字由调用设置,在函数执行过程中不能改变。

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

    var a = obj.foo;
    a();
    

    那么它的 this 将可能是 obj (在上面的情况下它将是 windowundefined in严格模式),因此如果 this 对象没有 bar 属性,则会得到不同的 bar 或错误。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2023-04-09
      • 2017-10-17
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多