修改javascript类属性
我想做的是,我有下面的课程修改javascript类属性,javascript,object-oriented-analysis,Javascript,Object Oriented Analysis,我想做的是,我有下面的课程 function Session(){ this.accounts = {}; this.setupAccounts = function(res){ this.accounts = res; log(res); log(this.accounts); }; this.test = function(){ log(this.accounts); }; } 类会话
function Session(){
this.accounts = {};
this.setupAccounts = function(res){
this.accounts = res;
log(res);
log(this.accounts);
};
this.test = function(){
log(this.accounts);
};
}
类会话有一个属性accounts,它将保存某些数据。但是为了初始化它,我将它初始化为一个空对象
接下来,我调用setupAccounts方法来修改accounts的值。例如,我读取一个文件,加载它的数据,然后将该数据存储在帐户中
但我有范围问题
例如,以下代码:
var session = new Session();
var user_account_path = '/adata/user_accounts.json';
loadJsonFile(user_account_path)
.then(session.setupAccounts);
session.test();
因此,我在上面的代码中所做的是将一个文件的内容提取为Json对象,然后将该数据传递给setupAccounts方法,以便将该数据存储在变量accounts中。但我的输出如下所示:
Object {arjrule3: Object} // printing the json object read from file
Object {arjrule3: Object} // locally changed value of accounts
console.log(session.accounts) // printing global value of accounts
{} // value has not changed.
var session = new Session();
var user_account_path = '/adata/user_accounts.json';
loadJsonFile(user_account_path)
.then(function(res){
session.setupAccounts(res); // Change Here
});
我做错了什么?为什么对象会话的帐户值没有更改
如果我按照以下方式编写代码,就会发生一些有趣的事情:
Object {arjrule3: Object} // printing the json object read from file
Object {arjrule3: Object} // locally changed value of accounts
console.log(session.accounts) // printing global value of accounts
{} // value has not changed.
var session = new Session();
var user_account_path = '/adata/user_accounts.json';
loadJsonFile(user_account_path)
.then(function(res){
session.setupAccounts(res); // Change Here
});
输出:
Object {arjrule3: Object}
Object {arjrule3: Object}
session.accounts
Object {arjrule3: Object} // works! Why ?
它是有效的,为什么会这样
var session = new Session();
var user_account_path = '/adata/user_accounts.json';
loadJsonFile(user_account_path)
.then(session.setupAccounts);
session.test();
在上面的示例中,您只是将函数“setupAccounts”作为回调传递。你需要先把它绑起来
var session = new Session();
var user_account_path = '/adata/user_accounts.json';
loadJsonFile(user_account_path)
.then(session.setupAccounts.bind(session));
session.test();
您添加的另一个示例之所以有效,是因为您在会话对象上调用“setupAccounts”函数,而不仅仅是传递对它的引用