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

Reply via email to