#javascript
#javascript
Вопрос:
Я пытаюсь вызвать метод set issue для этого класса сеанса извне класса, и это приводит к неперехваченной ошибке типа: session.issue не является функцией. Кто-нибудь может подсказать, что я делаю неправильно? Я все еще устраняю неполадки, поэтому в этом коде могут быть другие ошибки. Когда консоль.регистрируйте сам объект непосредственно перед попыткой доступа к его методу issue, он возвращает следующее:
Session {_useSessionStorage: false, _useLocalStorage: false, _useServerStorage: false, _mostUpToDate: null, _lastEdited: null, …}
_creation: 1602290317
_issue: null
_lastEdited: null
_lastOpened: null
_lines: null
_mostUpToDate: null
_useLocalStorage: false
_useServerStorage: false
_useSessionStorage: false
clearLines: (...)
creation: (...)
issue: (...)
lastEdited: (...)
lastOpened: (...)
lines: (...)
mostUpToDate: (...)
__proto__:
clearLines: (...)
constructor: class Session
creation: (...)
issue: (...)
lastEdited: (...)
lastOpened: (...)
lines: (...)
mostUpToDate: (...)
pullLocalData: ƒ pullLocalData()
pullSessionData: ƒ pullSessionData()
setLocalData: ƒ setLocalData(issue, lastOpened, lastEdited)
setServerData: ƒ setServerData(issue, lastOpened, lastEdited)
setSessionData: ƒ setSessionData(issue, lastOpened, lastEdited)
_pullLinesFromLocalStorage: ƒ _pullLinesFromLocalStorage()
_pullLinesFromServerDB: ƒ _pullLinesFromServerDB()
_pullLinesFromSessionStorage: ƒ _pullLinesFromSessionStorage()
_saveToLocalStorage: ƒ _saveToLocalStorage()
_saveToSessionStorage: ƒ _saveToSessionStorage()
_setData: ƒ _setData(issue, lastOpened, lastEdited)
_update: ƒ _update()
get clearLines: ƒ clearLines()
get creation: ƒ creation()
get issue: ƒ issue()
set issue: ƒ issue(newIssue)
get lastEdited: ƒ lastEdited()
get lastOpened: ƒ lastOpened()
get lines: ƒ lines()
set lines: ƒ lines(lines)
get mostUpToDate: ƒ mostUpToDate()
__proto__: Object
Вот полный класс:
class Session {
_useSessionStorage = false;
_useLocalStorage = false;
_useServerStorage = false;
_mostUpToDate = null;
_lastEdited = null;
_lastOpened = null;
_issue = null;
_creation = null;
_lines = null;
constructor(creation) { this._creation = creation; }
get creation() { return this._creation; }
get lastEdited() { return this._lastEdited; }
get lastOpened() { return this._lastOpened; }
set issue(newIssue) { this._issue = newIssue; this._update(); }
get issue() { return this._issue; }
get mostUpToDate() { return this._mostUpToDate; }
get clearLines() { this._lines = null; }
set lines(lines) {
if (lines != this._lines) {
this._lines = lines;
this._update();
}
}
get lines() {
console.log("lines()", this._creation);
this._lastOpened = Math.floor(Date.now() / 1000);
if (this._lines == []) {
switch (this._mostUpToDate) {
case "Session": this._pullLinesFromSessionStorage(); break;
case "Local": this._pullLinesFromLocalStorage(); break;
case "Server": this._pullLinesFromServerDB(); break;
}
}
return this._lines;
}
//creation -> issue, lastOpened, lastEdited, lines
pullSessionData() {
const session = JSON.parse(sessionStorage.getItem(this._creation));
this.setSessionData(session[0], session[1], session[2]);
}
pullLocalData() {
const session = JSON.parse(localStorage.getItem(this._creation));
this.setLocalData(session[0], session[1], session[2]);
}
setSessionData(issue, lastOpened, lastEdited) {
this._useSessionData = true;
if (this._lastEdited == null || lastEdited >= this._lastEdited) {
this._mostUpToDate = "Session";
this._setData(issue, lastEdited, lastOpened);
}
}
setLocalData(issue, lastOpened, lastEdited) {
this._useLocalStorage = true;
if (this._lastEdited == null || lastEdited >= this._lastEdited) {
this._mostUpToDate = "Local";
this._setData(issue, lastEdited, lastOpened);
}
}
setServerData(issue, lastOpened, lastEdited) {
this._useServerStorage = true;
if (this._lastEdited == null || lastEdited > this._lastEdited) {
this._mostUpToDate = "Server";
this._setData(issue, lastEdited, lastOpened);
}
}
//issue, lastOpened, lastEdited, lines
_setData(issue, lastOpened, lastEdited) {
this._issue = issue;
this._lastEdited = lastEdited;
this._lastOpened = lastOpened;
}
_update() {
this._lastEdited = Math.floor(Date.now() / 1000);
if (this._useLocalStorage) { this._saveToLocalStorage(); this._mostUpToDate = "Local"; }
if (this._useSessionStorage) { this._saveToSessionStorage(); this._mostUpToDate = "Session"; }
}
_saveToSessionStorage() {
sessionStorage.setItem(creation, JSON.stringify(this._issue, this._lastOpened, this._lastEdited, this._lines));
}
_saveToLocalStorage() {
localStorage.setItem(creation, JSON.stringify(this._issue, this._lastOpened, this._lastEdited, this._lines));
}
_pullLinesFromSessionStorage() {
this._lines = JSON.parse(sessionStorage.getItem(this._creation))[3];
}
_pullLinesFromLocalStorage() {
this._lines = JSON.parse(localStorage.getItem(this._creation))[3];
}
_pullLinesFromServerDB() {
}
}
Заранее спасибо!
Ответ №1:
В этом сеансовом классе,
set issue(newIssue) { this._issue = newIssue; this._update(); }
get issue() { return this._issue; }
вышеупомянутыми методами являются getter и setter (обозначаются через get
и set
).
Они не должны вызываться напрямую, как мы вызываем функцию. Они неявно вызываются, когда вы присваиваете значение свойству session.issue
, например session.issue = "Sample Issue"
, будет вызван метод setter .
При обращении к значению с session.issue
помощью, средство получения будет вызываться неявно.
Комментарии:
1. Спасибо за ваш ответ! Это имеет смысл. Я вызывал это как object.issue(новый выпуск).