Javascript无法从同一个类调用cross-method

时间:2012-11-02 20:08:37

标签: javascript oop object

我正在尝试在同一个类的另一个方法中访问我的类的'render'方法。 但得到了错误

  

“Uncaught TypeError:Object [object Window]没有方法'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)
    };

2 个答案:

答案 0 :(得分:1)

<强>更新 同时我看到你发布的代码,我发现你已经在匿名函数上调用了你的回调。我想我必须多做一些思考 截至目前,我很难过。


好的,所以你在下面评论了你通过回调呼叫getContent()的问题。
所以你的代码看起来有点像这样,我假设:

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

了解JavaScript实际上没有方法很重要。它具有函数,函数可以指定为对象的属性,但这并不意味着这些函数将以任何方式“归属”这些对象。

简单地说,函数里面的this可以指向调用(不是声明)函数“作为方法时点的左边的对象“;或者如果你调用函数“不作为方法”,则使用全局对象(窗口);或者它甚至可以指向某个其他对象任意对象,如果你使用告诉函数绑定或运行它 - 这可以通过使用Function.prototypecall中的一些“方法”来完成, applybind


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

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

或通过显式绑定您的对象作为其this

运行的函数
$.post(url, data, myObj.getContent.bind(myObj); )

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

答案 1 :(得分:0)

在这里工作:

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

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