在JavaScript中,如何从同一对象中的另一个方法调用方法?
我刚刚开始使用OOJavaScript,所以请耐心听我说 这项工作:在JavaScript中,如何从同一对象中的另一个方法调用方法?,javascript,jquery,oop,Javascript,Jquery,Oop,我刚刚开始使用OOJavaScript,所以请耐心听我说 这项工作: var myObj = { foo : function() { alert('hello'); this.bar(); }, bar: function() { alert('world'); } } 但是,如果我在“foo”方法中的hello警报之后执行一些其他操作,“this”的含义将从对象更改为我上次选择的
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的答案,我认为这更适合这种情况。在撰写本文时,我还没有完全理解您问题的背景,因为您没有添加实际的实现在…上