Javascript不能从同一个类调用cross方法
我正在尝试访问我的类的“render”方法,在同一类的另一个方法中。 但是我犯了错误 “未捕获的TypeError:对象[Object Window]没有“render”方法” 这是我的密码:Javascript不能从同一个类调用cross方法,javascript,oop,object,Javascript,Oop,Object,我正在尝试访问我的类的“render”方法,在同一类的另一个方法中。 但是我犯了错误 “未捕获的TypeError:对象[Object Window]没有“render”方法” 这是我的密码: function myObject(options) { this.top_offset = 100; this.right_offset = 50; }; myObject.prototype.render = function() { alert ("render"); }
function myObject(options) {
this.top_offset = 100;
this.right_offset = 50;
};
myObject.prototype.render = function() {
alert ("render");
};
myObject.prototype.getContent = function(data, params) {
// do something with the data
alert('done');
// !not working here!
this.render();
}
知道我做错了什么吗?
谢谢
编辑
下面的示例正在运行,与实际代码的区别在于,我在异步调用(get)之前实例化对象,并且对象的方法用作回调函数
// using the object
var o = new myObject('plop');
$.getJSON(url, toSend, function(data) {
}).success(function(e) {
myObject.getContent(e)
};
在这里工作:
猜测您没有正确调用对象在这里起作用:
猜测您没有正确调用对象更新:
同时,我看到了您发布的代码,并且我看到您已经在对匿名函数调用回调。那么,我想我得多想想。到现在为止,我都被难住了
好的,您已经在下面评论了您通过回调调用的
getContent()
。所以您的代码看起来有点像这样,我假设:
$.post(url, data, myObj.getContent);
了解JavaScript并没有真正的方法是很重要的。它有函数,函数可以指定为对象的属性,但这并不意味着这些函数将以任何方式“属于”这些对象
简单地说,函数内部的this
可以在调用(而不是声明)函数“作为方法”时指向点左侧的对象;或全局对象(窗口),如果调用函数“不作为方法”;或者,如果您使用告诉函数绑定或运行到它,它甚至可以指向其他对象任意对象——这可以通过使用函数中的一些“方法”来完成。prototype
:调用,应用,绑定
您可以通过创建一个匿名函数来解决问题,该函数将调用对象作为激活对象的getContent()
,如下所示:
var cb = function(){ myObj.getContent(); }
$.post(url, data, cb);
或者通过显式绑定要运行的函数,将对象作为其this
:
$.post(url, data, myObj.getContent.bind(myObj); )
第二种选择更安全,因为如果myObj
变量的值在该代码运行和调用回调之间发生变化,则可能会在错误的对象上调用getContent()
。更新:
同时,我看到了您发布的代码,并且我看到您已经在对匿名函数调用回调。那么,我想我得多想想。
到现在为止,我都被难住了
好的,您已经在下面评论了您通过回调调用的getContent()
。
所以您的代码看起来有点像这样,我假设:
$.post(url, data, myObj.getContent);
了解JavaScript并没有真正的方法是很重要的。它有函数,函数可以指定为对象的属性,但这并不意味着这些函数将以任何方式“属于”这些对象
简单地说,函数内部的this
可以在调用(而不是声明)函数“作为方法”时指向点左侧的对象;或全局对象(窗口),如果调用函数“不作为方法”;或者,如果您使用告诉函数绑定或运行到它,它甚至可以指向其他对象任意对象——这可以通过使用函数中的一些“方法”来完成。prototype
:调用,应用,绑定
您可以通过创建一个匿名函数来解决问题,该函数将调用对象作为激活对象的getContent()
,如下所示:
var cb = function(){ myObj.getContent(); }
$.post(url, data, cb);
或者通过显式绑定要运行的函数,将对象作为其this
:
$.post(url, data, myObj.getContent.bind(myObj); )
第二种方法更安全,因为如果myObj
变量的值在该代码运行和调用回调之间发生变化,则可能会在错误的对象上调用getContent()
。在实例化myObject
时没有使用new
操作符,而此
指向窗口对象,而不是myObject
对象@jbabey:如果这是问题所在,那么getContent
是如何运行的?您需要向我们展示完整的代码,包括如何实例化对象以及如何调用getContent()
@Zecc我正在异步调用(get)之前实例化对象,函数getContent用作my Get的回调。当实例化myObject
时,您没有使用new
操作符,并且此
指向窗口对象,而不是myObject
对象@jbabey:如果这是问题所在,那么getContent
是如何运行的?您需要向我们展示完整的代码,包括如何实例化对象以及如何调用getContent()
@Zecc我正在异步调用(get)之前实例化对象,函数getContent被用作我的getContent的回调函数我很高兴你的代码可以工作,但我仍然不确定你发布的代码为什么不能工作。哦,好吧,我有更好的事情要考虑:)很高兴我能帮上忙。我很高兴你的代码能正常工作,但我仍然不确定你发布的代码为什么不能正常工作。哦,好吧,我有更好的事情要考虑:)很高兴我能帮上忙。