2016-04-15 64 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

感谢您的帮助。您的代码按预期运行。但是,当我将更改应用于我的代码时,我得到相同的错误。我会仔细研究一下代码,看看你给我的链接,如果我还有问题,也许我可以给你发完整的代码。 –

相关问题