On 5/5/14, 4:21 PM, John Barton wrote:
Let me rephrase my question: why is the Proxy get even called in this case?
Because the way __proto__ works is as if the JS implementation had done:
(function() {
protoGetter = Object.getPrototypeOf;
Object.defineProperty(Object.prototype, "__proto__",
{
set: function() { /* magic here */ },
get: function() { return protoGetter(this); }
});
})();
before any page script got to run.
Which means that __proto__ is a simple accessor property on
Object.prototype. On the one hand, that means that by default it
appears on all objects. On the other hand it means it can be shadowed,
for example by someone doing an explicit defineProperty for that
property name on some object.
But it can also be shadowed by proxies, because those get to intercept
_all_ property access. So when a obj.__proto__ get happens the
implementation walks up the proto chain of "obj" looking for a proxy or
an object with an own property named "__proto__". If a proxy is found,
its get() is invoked and that's all there is to do as far as the
implementation is concerned. If an own property named "__proto__" is
found, then the implementation checks whether it's an accessor or value
property, and either returns the value or calls the getter, depending on
which sort it is.
-Boris
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss