0

我想在 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){});

非常感谢。

4

4 回答 4

1

我的问题是,当 onsuccess 执行时,我失去了主类的范围,这不是我所期望的。

它不是作用域,但this函数调用期间的值取决于函数的调用方式。所以发生的事情是,您分配给的函数req被调用时this与调用open.

我怎样才能做我正在寻找的东西?

由于您的函数已经在调用范围内关闭open,因此最简单的方法是按照Andy 的建议进行操作:

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,所以我也不知道是否要更改thisself那里。this.result如果是指向回调result的对象的属性,则完全有可能您真正想要。this

更多的:

于 2013-09-27T10:37:30.440 回答
1

只要范围发生变化,就可以像这样var req添加和使用:var self = this;

self.db = self.result;
于 2013-09-27T10:30:43.017 回答
0
var that = this
req.onsuccess = function (evt) {
    that.db = that.result;
    callback();
};

我也推荐阅读这篇文章:Scope and this in JavaScript

于 2013-09-27T10:34:52.950 回答
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");        
    };
  }
}
于 2013-09-27T10:30:36.077 回答