Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,如何从同一对象中的另一个方法调用方法?_Javascript_Jquery_Oop - Fatal编程技术网

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

在JavaScript中,如何从同一对象中的另一个方法调用方法?,javascript,jquery,oop,Javascript,Jquery,Oop,我刚刚开始使用OOJavaScript,所以请耐心听我说 这项工作: var myObj = { foo : function() { alert('hello'); this.bar(); }, bar: function() { alert('world'); } } 但是,如果我在“foo”方法中的hello警报之后执行一些其他操作,“this”的含义将从对象更改为我上次选择的

我刚刚开始使用OOJavaScript,所以请耐心听我说

这项工作:

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
var formObj={
验证:函数(表单){
$('input,textarea',theForm).each(function(){
var valueLength=$(this).val().length;
如果(valueLength==0){
$(this.addClass('invalid');
this.listenForInput($(this));//函数的this关键字由调用设置,在函数执行期间不能更改

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

var a = obj.foo;
a();

然后它可能是obj(在上述情况下,它将是窗口或在严格模式下未定义),因此,如果此对象没有bar属性,则会得到不同的bar或错误。

我是否遗漏了一些内容,或者您不能仅按名称引用对象,如下所示:

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

myObj.foo();

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

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));
        }
    });
},
您正在向每个
传递一个函数。在这个回调中,
这个
引用DOM元素。这就是为什么您要将它传递给jQuery(
$(this)
),以便能够调用该元素上的jQuery方法。它也不能引用
formObj


引用的内容取决于调用函数的方式,每个函数都有自己的
(更详细地描述了

如果使用
formObj.validate()
调用
validate
,则
引用
formObj

jQuery声明:

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


“其他东西”是什么,因为它不应该在该对象内部更改。您正在谈论的“其他东西”是什么?如果您正在创建回调,则“是”
“此”
将引用
窗口
(最有可能)。在这种情况下,您只需首先在
foo
内部创建对
this
的引用。我在编辑中发布了我的实际代码。请看一看。关于您的更新代码,您似乎希望
this
同时引用您的
formObj
,以及DOM元素。这是不会发生的。
this.listenForInput($(this));
是的,不知道你可以仅凭对象的名称引用它。所有教程都使用“this”关键字,上面的人说了“this”的含义应该永远不会改变。但对我来说确实如此,所以我不确定那里发生了什么,但这是有效的,谢谢。虽然这是一个修复方法,但我建议接受@Felix Kling的答案,我认为这更适合这种情况。在撰写本文时,我还没有完全理解您问题的背景,因为您没有添加实际的实现在…上