Proxy .__proto__ is not getPrototypeOf?

Boris Zbarsky bzbarsky at MIT.EDU
Mon May 5 13:32:56 PDT 2014

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.


More information about the es-discuss mailing list