2015-06-04 3 views
0

Что я пытаюсь сделать здесь, у меня есть следующий класс SessionМодифицирования Javascript атрибутов класса

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

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

Класс Session имеет атрибут счет, которые будут держать хранить определенные данные. Но чтобы инициализировать его, я инициализирую его как пустой объект.

Далее я вызываю метод setupAccounts для изменения значения учетных записей. Например, я читаю файл, загружаю его данные и сохраняю эти данные внутри учетных записей.

Но у меня проблемы с областью.

Например, следующий код:

var session = new Session(); 
var user_account_path = '/adata/user_accounts.json'; 
loadJsonFile(user_account_path) 
    .then(session.setupAccounts); 
session.test(); 

Так что я делаю в коде выше, извлечение содержимого файла в качестве объекта Json, а затем я передаю, что данные в методе setupAccounts в порядке для хранения этих данных в переменных учетных записях. Но мой результат выглядит следующим образом:

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 ? 

Он работает, почему это так?

ответ

0
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» на объект сессии, а не просто передать ссылку на него.

Смежные вопросы