面向对象分析-修改javascript类属性

object oriented analysis - Modifying javascript class attributes

本文关键字:属性 javascript 修改 面向对象分析      更新时间:2023-09-26

我在这里要做的是,我有以下类Session

function Session(){
    this.accounts = {};
    this.setupAccounts = function(res){
        this.accounts = res;
        log(res);
        log(this.accounts);
    };
    this.test = function(){
        log(this.accounts);
    };
}

Session类有一个属性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}
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"函数,而不仅仅是传递对它的引用