2016-04-15 65 views
0

嗨,我是JavaScript新手。我有一個對象ListModel,我想從第二個對象訪問addToModel方法。如何從第二個對象訪問一個對象的方法

function ListModel(){ 
    this.list = {}; 
} 

ListModel.prototype.addToModel = function(s){ 
    var items = s.split("\n"); 
    for(var i =0; i<items.length-1; i++){ 
     console.log(items[i] + "\n"); 
    } 

}

經過大量的搜索,我一直無法找到一個解決這個問題。

第二個目的是:

function ListMaker(){ 
    this.model = new ListModel(); 
} 

ListMaker.prototype.read = function(e){ 
    var f = e.target.files[0]; 

    if (f) { 
     var r = new FileReader(); 
     r.onload = function(e) { 
     var contents = e.target.result; 
     this.model.addToModel(contents); 
     document.getElementById("ta").innerHTML = contents; 
    } 
     r.readAsText(f); 
    } else { 
     alert("Failed to load file"); 
    } 
} 

在讀出方法我稱: this.model.addToModel(內容); 和控制檯返回 無法讀取未定義的屬性'addToModel' 如果我將該行更改爲: this.model = new ListModel()。addToModel(contents); 然後該方法按照原樣工作。

也許我正在以這種錯誤的方式去做。 任何幫助,將不勝感激。

回答

0

問題是

http://javascriptplayground.com/blog/2012/04/javascript-variable-scope-this/

一旦你調用一個函數,不再指向你認爲它是。

您需要在本地存儲這個然後在您的回調中引用本地。

ListMaker.prototype.read = function(e){ 
    var f = e.target.files[0]; 
    var _this = this; 
    if (f) { 
     var r = new FileReader(); 
     r.onload = function(e) { 
     var contents = e.target.result; 
     _this.model.addToModel(contents); 
     document.getElementById("ta").innerHTML = contents; 
    } 
     r.readAsText(f); 
    } else { 
     alert("Failed to load file"); 
    } 
} 

看到它在行動:​​

+0

感謝您的幫助。您的代碼按預期運行。但是,當我將更改應用於我的代碼時,我得到相同的錯誤。我會仔細研究一下代碼,看看你給我的鏈接,如果我還有問題,也許我可以給你發完整的代碼。 –

相關問題