2013-09-27 191 views
0

我想在javascript中創建一個類,以便與我的主代碼在與indexeddb對象的連接中重用。我現在擁有的是:Javascript類和範圍

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

這是否適合您?將開放函數放在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");   
    }; 
    } 
} 
+0

非常感謝大家,我想我會用ChrisC方法。 再次感謝這麼多有用的幫助。 – user2823022

1

var req添加var self = this;和使用這樣每當範圍的變化:

self.db = self.result; 
0
var that = this 
req.onsuccess = function (evt) { 
    that.db = that.result; 
    callback(); 
}; 

此外,我建議閱讀這篇文章:Scope and this in JavaScript

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。如果resultthis在回調中指向的對象的屬性,則完全有可能您實際上想要this.result

更多: