从localStorage解析ES6类对象不包括类功能

问题描述:

我想在HTML5 localStorage中保留一个类对象。该类包含我也需要坚持的方法,但是解析localStorage对象表明该对象不相同。从localStorage解析ES6类对象不包括类功能

class ExcitingMath { 

    constructor(firstNumber, secondNumber) { 

     this._firstNumber = firstNumber; 
     this._secondNumber = secondNumber; 
    } 

    add() { 

     return this._firstNumber + this._secondNumber; 
    } 

    subtract() { 

     return this._firstNumber - this._secondNumber; 
    } 
} 

const eMath = new ExcitingMath(2, 4); 

在控制台登录eMath显示与它类对象的属性和方法:

enter image description here

然而,当我localStorage.setItem("math", JSON.stringify(eMath));JSON.parse(localStorage.getItem("math"));对象到和从localStorage,它不再包括构造函数或方法。

enter image description here

我如何能坚持与localStorage的原始类的实例?

这是不可能的,因为JSON.toString只是保存对象的状态,而不是你已经发现的对象的功能。我面临同样的“问题”,写在我的课的功能“fromJSON”从localStorage的取JSON和转换是到对象如下:

class ExcitingMath { 

    constructor(firstNumber, secondNumber) { 

     this._firstNumber = firstNumber; 
     this._secondNumber = secondNumber; 
    } 

    add() { 

     return this._firstNumber + this._secondNumber; 
    } 

    subtract() { 

     return this._firstNumber - this._secondNumber; 
    } 

    static fromJSON(serializedJson) { 
     return Object.assign(new ExcitingMath(), JSON.parse(serializedJson)) 
    } 
} 

然后,您可以按如下方式使用它:

const eMath = ExcitingMath.fromJSON(JSON.parse(localStorage.getItem("math"))) 
+2

考虑到静态fromJSON(json)的mehod签名,可以考虑传递文本。然后在方法中做一些类似'return Object.assign(new ExcitingMath(),JSON.parse(text))''。有关属性,请参见[* Object.assign *](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-object.assign)。所以它会是'ExcitingMath.fromJSON(文本)'。 ;-)。 – RobG