Consider:
Object.defineProperty(Object.prototype, "0", { value: 17, writable: false,
configurable: false });
[].push(42);
Per ES5, I think this is supposed to throw a TypeError. The push should be
setting property "0" with Throw = true, which means that when [[CanPut]] fails,
a TypeError gets thrown. No engine I can test does this, I suspect because
everyone's mis-implemented an optimization.
On IRC it was pointed out that
http://wiki.ecmascript.org/doku.php?id=strawman:fixing_override_mistake is
supposed to fix this: you should be able to shadow a non-writable property on a
prototype. Or something. But there's contention there about this not actually
being a mistake. (I think that contention's probably right, for what it's
worth, but I digress.)
But suppose it isn't, for the moment. What then of this:
Object.defineProperty(Object.prototype, 0, { set: function() { throw "FAIL";
} });
[].push(42)
I think this should throw, again because it's *setting* property "0". But
again, no engine I can test actually throws for this.
My gut says this is a case where every engine attempted to optimize, and
optimized wrongly such that incorrect semantics resulted. The question is,
since no engine's following the spec, whether the spec should change, the
engines should change, or what. Given that indexed properties on
Array.prototype and Object.prototype are not something anyone sane does, I tend
to think changing it to [[DefineOwnProperty]] would be good. But maybe the
spec really should win, and everyone should change. I dunno. Please sort this
out! :-)
Jeff
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss