2017-04-26 5 views
0

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へとからI localStorage.setItem("math", JSON.stringify(eMath));JSON.parse(localStorage.getItem("math"));オブジェクト、それはもはや含まれている場合コンストラクタまたはメソッド。

enter image description here

にはどうすればいいのlocalStorageと元のクラスのインスタンスを永続化することができますか?

答えて

3

JSON.toStringはオブジェクトのSTATEを保存するだけで、すでに見つかったオブジェクトの機能は保存しないため、これは不可能です。私は同じ「問題」を直面してのlocalStorageからJSONを取り、次のようにオブジェクトにあることを変換私のクラスで機能「fromJSON」を書いた:

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(text)'になります。 ;-)。 – RobG