http://webreflection.blogspot.ca/2014/05/fixing-java-nashorn-proto.html all right, you might think __proto__ is my obsession but for fuck sake not a single engine got it right so far ... and it's perfectly spec'd in ES6 too so I don't know what is with nashorn here ... // how to fix nashorn Object.defineProperty( Object.prototype, '__proto__', { configurable: true, get: function () { return Object.getPrototypeOf(this); }, set: function (proto) { Object.setPrototypeOf(this, proto); } } ); Are You Asking Why? Here the answer: nashorn is broken, since it does not expose __proto__ quirks anywhere. '__proto__' in {} is false Object.getOwnPropertyNames(Object.prototype).indexOf('__proto__') is a -1 negative Object.getOwnPropertyDescriptor(Object.prototype, '__proto__') is null Basically even most common basic features detections for '__proto__' are screwed, so that not a single library can trust its own code ... how cool is that ... Broken null Objects Too The worst of the worst comes with null objects, where the infamous property makes dictionaries pointless, not secure, and unreliable ... I start thinking the web world was not even ready for dictionaries, it's taking forever to have a reliable one var o = Object.create(null); // it's a null object // nothing should affect it o.__proto__ = []; // but nashorn is brilliant // as old Android 2.1 phones here o instanceof Array; // true Congratulation, you never understood what was the purpose of __proto__ Quick Specs Recap So, since it's apparently the first rocket science problem ever, here a quick summary of how stupidly simple is the __proto__ spec: if it's a literal expression, not wrapped in quotes, it defines inheritance at runtime: {__proto__:[]} which is an instanceof Array VS {"__proto__":[]} which is just valid JSON and won't even affect inheritance if accessed through the Object.prototype, where whatever object that inherits from null should NOT be involved, and where __proto__ has not been defined as own property, it behaves as described in the first snippet I've created to fix nashorn everything else is an epic fail So please fix this madness once for all ... it's about reading specs and implementing them properly, even if Appendix B of whatever status ES6 is ... or GTFO!
|