<div dir="ltr">If classes contain all the "super powers" and their instance handle their own states it's straight forward to serialize JS these days following basic conventions (easy to do with poisoned objects)<div><br></div><div>```js</div><div><div>class Serializable {</div><div><br></div><div>  // usable as JSON.parse(str, Serializable.fromJSON)</div><div>  static fromJSON(key, value) {</div><div>    if (value.hasOwnProperty('__proto__')) {</div><div>      const Class = value.__proto__.split('.').reduce(</div><div>        (o, k) => o[k],</div><div>        typeof global === 'object' ? global : window</div><div>      );</div><div>      delete value.__proto__;</div><div>      return Object.create(Class.prototype, value);</div><div>    }</div><div>    return value;</div><div>  }</div><div><br></div><div>  // provide a way to retrieve your class back</div><div>  // from a namespace</div><div>  static toJSON() {</div><div>    return <a href="http://this.name">this.name</a>;</div><div>  }</div><div><br></div><div>  // serialize any instance</div><div>  toJSON() {</div><div>    return Object.defineProperty(</div><div>      Object.getOwnPropertyDescriptors(this),</div><div>      '__proto__',</div><div>      {</div><div>        enumerable: true,</div><div>        value: this.constructor.toJSON()</div><div>      }</div><div>    );</div><div>  }</div><div>}</div></div><div><br></div><div>```</div><div><br></div><div>Assuming the class is somehow reachable, something that is an issue with any other language too (the class must be available to properly unserialize)</div><div><br></div><div>```js</div><div><div>window.Anything = class Anything extends Serializable {</div><div>  constructor(pub, acc) {</div><div>    super();</div><div>    this.public = pub;</div><div>    this.accessor = acc;</div><div>  }</div><div>  get accessor() {</div><div>    return this._private;</div><div>  }</div><div>  set accessor(value) {</div><div>    Object.defineProperty(this, '_private', {</div><div>      configurable: true,</div><div>      value</div><div>    });</div><div>  }</div><div>};</div></div><div>```</div><div><br></div><div>you can serialize and unserialize instances with ease:</div><div><br></div><div>```js</div><div><div>const before = new Anything(123, 456);</div><div><br></div><div>const serialized = JSON.stringify(before);</div><div><br></div><div>const after = JSON.parse(serialized, Anything.fromJSON);</div><div>console.log(</div><div>  after.public,</div><div>  after.accessor</div><div>);</div></div><div>```</div><div><br></div><div>There are also battle tested utilities to make recursive properties serializable too (CircularJSON to name one).</div><div><br></div><div>Yet, what everyone serliazes and unserializes instead, is some data any instance could eventually consume so having full classes/instances there doesn't apparently bring much value.</div><div><br></div><div>Serialization is IMO one of those things when you come from capable langauges you apparently cannot live without, but you forget on your way with JS and its debugging ability across various environments.</div><div><br></div><div>Regards</div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 27, 2017 at 8:17 PM, Florian Bösch <span dir="ltr"><<a href="mailto:pyalot@gmail.com" target="_blank">pyalot@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class="">On Thu, Nov 2, 2017 at 4:43 AM, kai zhu <span dir="ltr"><<a href="mailto:kaizhu256@gmail.com" target="_blank">kaizhu256@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> the primary reason is because traditional oop skills gained from c#/c++/java/python/etc translate poorly to javascript.<br></blockquote></span><div>I've never found that to be the case.</div><span class=""><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>in javascript, class-instantiated objects are inferior to plain-objects, because plain-objects come with JSON.stringify/JSON.parse baked-in, while classes require needless extra serialization/deserialization routines which can easily double your codebase or more (as real-world javascript-code is heavily i/o based). i would say many people burn-out from frontend-programming because they can’t cope with debugging all the i/o edge-cases serializing/deserializing their custom classes.<br>
><br>
>javascript and frontend-programming is essentially about efficiently managing the program-state like a baton, constantly passing it back-and-forth between the browser’s ui and various backend-servers / persistent-storage. plain json-objects utilizing idiot-proof JSON.stringify/JSON.parse, are naturally better at this baton-passing business than writing classes with custom serializers.<br></blockquote></span><div>I dislike many things about JS, and I've been writing JS since 2002. It never occured to me, not once, until 3 minutes ago, that this was in any way, shape or form some significant JS disadvantage, primary concern of anything or even any sort of impediment.</div></div></div></div>
<br>______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>