我不喜欢getJSON
这个原因,与ajax
.
基本上,当success
函数执行时,this
不再指向您的ObjectProvider
实例。为了解决这个问题,您可以改用ajax,它提供了一个有用的context
属性:
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 或具有 shim 的浏览器(如上面的链接所述)。
还有提到的版本,用于存储实例的闭包,但我个人更喜欢避免在不是绝对必要的情况下。如今,对于这种行为,它被认为是一种古老的做法。
谈论闭包:你不需要在构造函数中声明函数。这样,它们一直是动态添加的,如果它们没有访问某些内部变量,那就没有理由了,这只是浪费资源。需要明确的是,在您的情况下,如果您有:
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()