Javascript类和范围

时间:2013-09-27 10:26:22

标签: javascript class scope indexeddb

我想在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 个答案:

答案 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.resultresult在回调上指向的对象的属性,那么您实际上可能需要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