Add an option to omit prototype of objects created by JSON.parse()?

# 段垚 (8 years ago)

It is usually a bad practice to let a map object (an plain object used as a key-value map) have a prototype.

Objects created by JSON.parse() have a prototype by default, and we can get rid of them by:

JSON.parse(str, function(k, v) {

 if (v && typeof v === 'object' && !Array.isArray(v)) {

    v.__proto__ = null;

 }

 return v;

});

However, implementors warn that mutating prototype causes "performance hazards" [1].

How about adding an option to omit prototype of objects created by JSON.parse()?

E.g.:

JSON.parse(str, { noPrototype: true });

[1] developer.mozilla.org/en-US/docs/Web/JavaScript/The_performance_hazards_of__[[Prototype]]_mutation

# Jordan Harband (8 years ago)
JSON.parse(str, (k, b) => {
  if (v && typeof v === 'object' && !Array.isArray(v)) {
    return Object.create(null, Object.getOwnPropertyDescriptors(v));
  }
  return v;
});
# 段垚 (8 years ago)

I thought my original mail did not reach es-discuss and re-sent it.

Please refer to esdiscuss.org/topic/proposal-add-an-option-to-omit-prototype-of-objects-created-by-json-parse

It seems the overhead of creating a prototypeless copy is significant, and Object.getOwnPropertyDescriptors(v) creates even more objects.

在 2016/10/1 11:19, Jordan Harband 写道:

# Bob Myers (8 years ago)

What is the problem with the object resulting from JSON.parse having a prototype again?

# 段垚 (8 years ago)

One of the explanations:

"The pitfalls of using objects as maps in JavaScript" www.2ality.com/2012/01/objects-as-maps.html

在 2016/10/1 21:19, Bob Myers 写道: