вызов метода set класса приводит к «Неперехваченной ошибке типа: session.issue не является функцией»

#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(новый выпуск).