1

この同じクラスの別のメソッドで、クラスのメソッド'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)
    };
4

2 に答える 2

1

更新: 一方、あなたが投稿したコードを見ていると、匿名関数で既にコールバックを呼び出していることがわかります。だったらもう少し考えないといけないなと。
今のところ、私は困惑しています。


getContent()さて、コールバックを介して呼び出している質問の下にコメントしました。
したがって、コードは次のようになります。

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

JavaScript には実際にはメソッドがないことを理解することが重要です。関数があり、関数はオブジェクトのプロパティとして割り当てることができますが、これらの関数がこれらのオブジェクトに「属する」という意味ではありません。

this簡単に言えば、関数の内部は、関数を「メソッドとして」呼び出す(宣言しない) ときに、ドットの左側にあるオブジェクトを指すことができます。または、「メソッドとしてではなく」関数を呼び出す場合はグローバル オブジェクト (ウィンドウ)。または、関数にバインドまたは実行するように指示する場合は、他のオブジェクトの任意のオブジェクトを指すことさえできます。これはFunction.prototypecallapplybind.


getContent()次のように、オブジェクトをアクティベーションオブジェクトとして呼び出す匿名関数を作成することで、問題を解決できます 。

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

または、関数をオブジェクトとして実行するように明示的にバインドしますthis

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

myObjこのコードが実行されてからコールバックが呼び出されるまでの間に変数の値が変化するとgetContent()、間違ったオブジェクトを呼び出すことになる可能性があるため、2 番目の方法はより安全です。

于 2012-11-02T20:55:13.127 に答える
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();​

オブジェクトを正しく呼び出していないと推測

于 2012-11-02T20:13:31.560 に答える