13.2.2 [[Construct]], constructor, and [[Class]] (was __proto__)

P T Withington ptw at pobox.com
Mon Sep 24 04:47:27 PDT 2007


On 2007-09-23, at 14:14 EDT, Brendan Eich wrote:

>> But for ES3 and real web compatibility, I don't think changing the
>> algorithm to not allow ordinary ES3 functions used as constructors to
>> return objects other than the one set up by [[Construct]] will work.
>
> Right, this will break the web. Tucker can weigh in on the
> workarounds OpenLaszlo needed to cope with the instance of this bug
> in Flash (AS2, and I think AS3 still, do not let a function return a
> different object from the one passed in as this when called via new).

The particular case that bit us was trying to create a portable  
'inherited hash' (a constructor to create an object with another  
object as its [[proto]].  We wanted to write a constructor:

function InheritedHash(from) {
   if (from) {
     function xtor() {};
     xtor.prototype = from;
     return new xtor();
   }
   return this;
}

We originally worked around this by rewriting all `new` calls in our  
compiler to be function calls instead.  Since this was the only case  
where we needed to be able to return an alternate object from a  
constructor, we eventually just replaced it with a factory and  
replaced all calls.

[InheritedHash may or may not be a good idea.  The original concept  
was that it was more efficient than copying all the values into a new  
hash -- sharing of values was not actually a requirement.]



More information about the Es4-discuss mailing list