次の JavaScript オブジェクトがあります。
var UsersControl = {
users: null,
fetchData: function() {
$.ajax({
type: "GET",
dataType: "json",
context: this,
url: "../php/client/json.php",
data: {
type: "users"
}
}).done(function(response) {
this.users = response;
});
},
getData: function() {
if (this.users == null) {
this.fetchData();
}
return this.users;
}
};
getData()
メソッドを実行すると、users
フィールドは既に定義されていますがnull
、この呼び出しでは古い値 ( ) が返されます。次の呼び出しでは、適切な値 (ajax-ed) が返されます。JavaScript コンソール セッションの例:
> UsersControl
> Object {users: null, fetchData: function, getData: function}
> UsersControl.getData()
> null
> UsersControl
> Object {users: Array[2], fetchData: function, getData: function}
> UsersControl.getData()
> [Object, Object]
メソッドが呼び出されたときにJavaScriptがオブジェクトの現在の状態を記憶しているように見えます-そして、メソッドが終了した後にすべての状態の変更が適用されます。ただし、これにより、オブジェクト フィールドの変更をその場で実行することができなくなります (これまでに使用したすべての OOP 言語と同様)。または、単純に、どこかにバグがあります。このトピックに関するヒントをいただければ幸いです。