Вызов JSON.parse из функции возвращает неопределенное значение

#javascript #json

Вопрос:

Мне нужно сохранить JSON в переменной. У меня есть следующая функция:

 retrieve(){
    JSON.parse(localStorage.getItem('todos'));
}
 

И я пытаюсь сохранить возврат функции в переменной.

 this.todos = this.retrieve()
 

Но я получаю:

model.js:5 Неучтенная ошибка типа: Не удается прочитать свойство «извлечь» неопределенного

Если я сделаю это вместо этого, это сработает:

 this.todos = JSON.parse(localStorage.getItem('todos'));
 

Почему это происходит?

Изменить: Полный код

 export default class Model {

constructor(){
    this.view = null;
    this.todos = this.retrieve();
    if(!this.todos || this.todos.length < 1){
        this.todos = [
            {
                id: 0,
                title: 'default',
                description: 'default',
                completed: false,
            }
        ]
        this.id = 1;
    }
    this.id = this.todos[this.todos.length - 1].id   1;

    retrieve(){
         return JSON.parse(localStorage.getItem('todos'));
    }

}
 

Спасибо всем.

Комментарии:

1. вам нужно return что-то из функции, если вы хотите, чтобы она что-то возвращала

2. @JaromandaX На самом деле я пытался вернуться, но результат был тот же, поэтому я просто пытался без возврата и другими способами.

3. Это зависит от того, где вы это выполняете this.todos = this.retrieve() ? Мое быть внутри обычной функции вместо функции со стрелкой.

4. @RajdeepDebnath retrieve () — это метод класса. это.todos находится в конструкторе класса.

5. retrieve() не должно быть в конструкторе, вы хотите, чтобы он был методом класса

Ответ №1:

Ваши методы уровня класса должны находиться вне конструктора.

 localStorage.setItem('todos', JSON.stringify([{id:1},{id:2},{id:3}]))

class Model {

constructor(){
    this.view = null;
    this.todos = this.retrieve();
    if(!this.todos || this.todos.length < 1){
        this.todos = [
            {
                id: 0,
                title: 'default',
                description: 'default',
                completed: false,
            }
        ]
        this.id = 1;
    }
    this.id = this.todos[this.todos.length - 1].id   1;

}



    retrieve(){
         return JSON.parse(localStorage.getItem('todos'));
    }
}

console.log(new Model());