getJSON
私はこの理由で好きではありません、それはに比べて制限が多すぎajax
ます。
基本的に、success
関数が実行されると、インスタンスthis
をポイントしなくなりますObjectProvider
。これを解決するには、代わりにajaxcontext
を使用して、便利なプロパティを提供します。
function ObjectProvider(){
this.url = "ajax/inbounds.php"
this.inBounds = function(){
this.removeMarkers();
var url_string = this.url;
$.ajax({
url: this.url,
dataType: "json",
context: this,
success: function(data) {
for( i=0; i != data.length; ++i ){
this.createObject( data[i] );
}
});
};
this.createObject = function(_data){};
this.removeMarkers = function(){};
};
それ以外の場合は、 bindを使用できます:
$.getJSON(url_string, function(data) {
for( i=0; i != data.length; ++i ){
this.createObject( data[i] );
}
}.bind(this));
特定のコンテキストオブジェクトに「バインド」された新しい関数を作成するため。ただし、ES5をサポートしている、またはそのためのシムを備えているブラウザーでのみ(上記のリンクで説明されているように)。
言及されたバージョン、インスタンスを格納するためのクロージャーもありますが、私は個人的に、厳密に必要でない場合はそれを避けることを好みます。今日、この種の行動については、それは古い慣習と見なされています。
そして、クロージャーについて話します。コンストラクター内で関数を宣言する必要はありません。このようにして、それらは常に動的に追加され、一部の内部変数にアクセスしていない場合、理由がない場合は、リソースの浪費にすぎません。明確にするために、あなたの場合、あなたが持っているなら:
var a = new ObjectProvider();
var b = new ObjectProvider();
console.log(a.createObject === b.createObject) // false
より良いアプローチは次のとおりです。
function ObjectProvider() {
}
ObjectProvider.prototype = {
constructor: ObjectProvider,
url: "ajax/inbounds.php",
inBounds: function () { /* ... */ },
createObject: function () { /* ... */ },
removeMarkers: function () { /* ... */ }
}
var a = new ObjectProvider();
var b = new ObjectProvider();
console.log(a.createObject === b.createObject) // true
ただし、その時点で、動的プロパティがない場合(たとえば、URLが常に同じで、パラメーターとしてコンストラクターに渡されない場合)、別のインスタンスを用意する必要がない可能性があります。ちょうどそして上へ:
var ObjectProvider = {
url: "ajax/inbounds.php",
inBounds: function () { /* ... */ },
createObject: function () { /* ... */ },
removeMarkers: function () { /* ... */ }
};
そして、それを「シングルトン」として使用します。
ObjectProvider.createObject()