【问题标题】:Javascript cannot call cross-method from the same classJavascript 不能从同一个类调用交叉方法
【发布时间】:2012-11-02 20:08:37
【问题描述】:

我正在尝试在同一个类的另一个方法中访问我的类的“render”方法。 但是报错了

"Uncaught TypeError: Object [object Window] has no method '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)
    };

【问题讨论】:

  • 您在实例化myObject 时没有使用new 运算符,并且this 指向的是窗口对象而不是myObject 对象。 jsfiddle.net/vkKJg
  • @jbabey:如果这是问题所在,那么getContent 是如何运行的?
  • 您需要向我们展示完整的代码,包括您如何实例化对象以及如何调用getContent()
  • @Zecc 我在异步调用(get)之前实例化对象,函数getContent用作我的get的回调

标签: javascript oop object


【解决方案1】:

更新: 同时,我看到了您发布的代码,并且我看到您已经在匿名函数上调用了您的回调。那么,我想我必须做更多的思考。
到现在为止,我被难住了。


好的,您已在问题下方评论说您正在通过回调调用getContent()
所以你的代码看起来有点像这样,我假设:

$.post(url, data, myObj.getContent);

了解 JavaScript 并没有真正的方法很重要。它具有函数,并且函数可以作为对象的属性分配,但这并不意味着这些函数将以任何方式“属于”这些对象。

函数内部的this,简单地说,可以在调用(不声明)函数“作为方法”时指向点左侧的对象;或全局对象(窗口),如果您“不作为方法”调用该函数;或者它甚至可以指向其他对象任意对象,如果你使用告诉函数绑定或运行它——这可以通过使用Function.prototype中的一些“方法”来完成:callapplybind.


您可以通过创建一个匿名函数来解决您的问题,该函数将调用 getContent() 并将您的对象作为它的激活对象,如下所示:

var cb = function(){ myObj.getContent(); }
$.post(url, data, cb);

或者通过显式绑定你的函数来运行你的对象作为它的this:

$.post(url, data, myObj.getContent.bind(myObj); )

第二种选择更安全,因为如果myObj 变量的值在这段代码运行和回调被调用之间发生变化,您最终可能会在错误的对象上调用getContent()

【讨论】:

  • 我很高兴您的代码可以正常工作,但我仍然不确定您发布的代码为什么不起作用。哦,好吧,我有更好的事情要考虑 :) 很高兴我能以某种方式提供帮助。
【解决方案2】:

在这里工作:

http://jsfiddle.net/NKkzb/

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();
}


var a = new myObject();
a.getContent();​

猜测你没有正确调用你的对象

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2012-08-11
    • 2023-03-24
    • 2023-04-09
    相关资源
    最近更新 更多