我想在javascript中创建一个类,以便在与indexeddb对象的连接中从我的主代码中重用。我现在拥有的是:
function DATABASE() {
this.DB_NAME = 'MYdatabase';
this.DB_VERSION = 1;
this.db = null;
this.results = null;
}
DATABASE.prototype.open = function(callback) {
var req = indexedDB.open(this.DB_NAME, this.DB_VERSION);
req.onsuccess = function (evt) {
this.db = this.result;
callback();
};
req.onerror = function (evt) {
console.error("openDb:", evt.target.errorCode);
};
req.onupgradeneeded = function (evt) {
console.log("openDb.onupgradeneeded");
};
}
我的问题是,当onsuccess执行时,我放松了我的主类的范围,这不是我所期望的。我怎样才能做我想要的? 我希望与此同时建立一些联系,例如:
var DB = new DATABASE();
DB.open(function(res){});
var DB2 = new DATABASE();
DB2.open(function(res){});
var DB3 = new DATABASE();
DB3.open(function(res){});
非常感谢。
答案 0 :(得分:1)
在var req
下添加var self = this;
并在范围发生变化时使用这样的内容:
self.db = self.result;
答案 1 :(得分:1)
我的问题是,当onsuccess执行时,我放松了我的主类的范围,这不是我所期望的。
它不是范围,但函数调用期间this
的值取决于函数的调用方式。所以正在发生的事情是,您分配给req
的功能的调用时this
与不同的值比调用open
时更多。
我怎样才能做我想要的事?
由于您的功能已经超出了对open
的调用范围,因此最简单的方法是执行what Andy suggested:
DATABASE.prototype.open = function(callback) {
var req = indexedDB.open(this.DB_NAME, this.DB_VERSION);
var self = this; // <=== New
req.onsuccess = function (evt) {
self.db = this.result; // <=== Changed
callback();
};
// ...
}
注意:在更改后的行中,我不知道this.result
是什么,因此我不知道是否还要将this
更改为self
。如果this.result
是result
在回调上指向的对象的属性,那么您实际上可能需要this
。
更多:
答案 2 :(得分:0)
这对你有用吗?将open函数放在DATABASE中而不是原型上。
function DATABASE() {
var _this=this;
_this.DB_NAME = 'MYdatabase';
_this.DB_VERSION = 1;
_this.db = null;
_this.results = null;
_this.open = unction(callback) {
var req = indexedDB.open(_this.DB_NAME, _this.DB_VERSION);
req.onsuccess = function (evt) {
_this.db = _this.result;
callback();
};
req.onerror = function (evt) {
console.error("openDb:", evt.target.errorCode);
};
req.onupgradeneeded = function (evt) {
console.log("openDb.onupgradeneeded");
};
}
}
答案 3 :(得分:0)
var that = this
req.onsuccess = function (evt) {
that.db = that.result;
callback();
};
我还建议你阅读这篇文章:Scope and this in JavaScript