Я строю библиотеку, которая грубо изложена следующим образом. Есть пара переменных, обработчик событий и метод, который приводит к запуску соответствующего события. Наконец, я продлеваю сделку с собственностью. Это идет как это (я добавил некоторые ///...
где я вырезается другой код):Можете ли вы получить доступ к объектно-определенному свойству в частном методе в JavaScript?
$.collidR = function (options) {
/// ...
var hubName = 'CollidRHub';
var hubProxy = connection.createHubProxy(hubName);
/// ...
hubProxy.on('registrationComplete', function (username, hasChanges) {
$(window).triggerHandler(events.onRegistrationComplete, { username: username, hasChanges: hasChanges });
log(username + " has successfully registered for this entity.");
// capture current user
this._currentUser = username;
// hook for catching up when user joins after edits
if (hasChanges) {
log("There are outstanding changes for this entity...");
}
});
/// ...
this.registerClient = function() {
/// does some stuff that makes registrationComplete fire
/// ...
};
};
Object.defineProperty($.collidR.prototype, "currentUser", {
get: function() {
return this._currentUser ? this._currentUser : "";
}
});
Обратите внимание, что выше this._currentUser = username
немного не похоже на работу. Я думаю, что это проблема с инкапсулированием, к чему и идет этот вопрос.
В отдельной, но связанной библиотеке я создаю экземпляр collidR
, и мне нужно ответить на событие. У меня есть обработчик для этого устанавливается следующим образом:
$(window).on(collidR.events.onEditorsUpdated, function (e, data) {
/// ...
users.forEach(function (user) {
var currentUser = collidR.currentUser;
// here, currentUser is always default of ""
if (user != currentUser) {
/// ...
}
});
});
Вот что я вижу:
- Мои
registrationComplete
пожаров событие и обработчик успешно - вызывается из отладчика,
this._currentUser
не определено до того, как значение установлено - линия
this._currentUser = username
выполняется и значение устанавливается - Когда
onEditorsUpdated
эв лор пожары,collidR.currentUser
всегда значение по умолчанию (пустая строка) в моем обработчике
Что чувствует испорченным где я определить свойство - после того, как остальная часть объекта. Это как если бы я изменял прототип объекта после определения метода, который пытается ссылаться на свойство ... это не может быть прав.
Я также пробовал this.currentUser
(во внутреннем методе), но имел тот же результат.
Я предположил, что если прототип был расширен до того, как был вызван внутренний метод, когда я сделал var currentUser = collidR.currentUser;
, что я получил бы значение из свойства, но это всегда пустая строка.
Есть ли способ зарегистрировать недвижимость раньше?
Есть ли правильный способ установить значение, чтобы я мог получить к нему доступ позже через открытое свойство?
Что такое '' '' '' '' ', когда вы делаете' this._currentUser'? –
переменная 'collidR' во втором фрагменте, это экземпляр' $ .collidR'. я имею в виду, это определило его с 'collidR = new $ .collidR' или ярлыком $ .collidR? – Bharath
@Bharath - это экземпляр, определенный как вы предлагаете с помощью 'var collidR = new $ collidR;'. – MisterJames