从本地存储检索到对象方法后未定义?

时间:2020-10-12 22:40:22

标签: javascript

我用原型方法changeStatus创建了一个Book对象,该方法可以更改书的读取状态。显示现有书籍,并将所有新书籍添加到本地存储中。但是,每当我尝试从本地存储中检索图书时(即通过刷新页面),changeStatus方法都会返回此错误,

library.html:154未捕获的TypeError:myLibrary [i] .changeStatus不是函数 在HTMLButtonElement。

我尝试更改要在构造函数中声明的方法,还尝试使用.toString()而不是JSON.stringify()将函数转换为字符串。但这似乎仍然行不通。

https://drive.google.com/drive/folders/1N4bbPA3XjO8skaC_Ab965UmGd8fefd0b?usp=sharing

        let myLibrary = [];
        function Book(title, author, numPages, readStatus) {
            this.title = title;
            this.author = author;
            this.numPages = numPages;
            this.readStatus = readStatus;
        }
        Book.prototype.changeStatus = function(currentStatus) {
            const statuses = ["Not Started", "In Progress", "Completed"];
            let currentIndex = statuses.indexOf(currentStatus);
            this.readStatus = statuses[(currentIndex+1)%3];
        }
        var book1 = new Book("Book title", "Book author", "512", "In Progress");
        var book2 = new Book("Test book title", "Test book author", "256", "Completed");
        myLibrary.push(book1);
        myLibrary.push(book2);
        // setting and getting local storage
        if (!localStorage.getItem("libraryBooks")) {
            populateStorage();
        } 
        else {
            retrieveBooks();
        }
    
        function populateStorage() {
            localStorage.setItem("libraryBooks", JSON.stringify(myLibrary, function(key, value) {
                return (typeof value === "function") ? value.toString() : value;
            }));
            
        }

         
        function retrieveBooks() {
            myLibrary = JSON.parse(localStorage.getItem("libraryBooks", function(key, value) {
                if(typeof value != 'string') return value;
                return ( value.substring(0,8) == 'function') ? eval('('+value+')') : value;
            }));
            
        }

1 个答案:

答案 0 :(得分:-1)

  1. 本地存储只能处理json数据

  2. json没有功能

因此,为了达到目的,只需在调用该函数之前将json解析为对象即可。这是伪代码

driver.find_element_by_css_selector("button[title ='enroll']").click() 

这只是未经测试的原始代码,但可以肯定地工作;)