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

Brendan Eich brendan at mozilla.org
Sun Sep 23 11:14:47 PDT 2007


On Sep 23, 2007, at 8:59 AM, liorean wrote:

>> 1. The constructor property should be on the object instance  
>> *created*
>> by the function.
>
> That argument I agree with. It should be on the instance and not  
> the prototype.

The reason for the original prototype-owned constructor was to afford  
a back-pointer from prototype to constructor function without  
imposing a per-instance property (which could be optimized to be  
shared where possible, overridden where desired -- but at some cost  
in implementation complexity).

I'm not convinced it's worth changing this for ES4. Anyway it is very  
late to have a new proposal -- we are finalizing proposals next week  
at the face-to-face meeting.

> On 23/09/2007, Garrett Smith <dhtmlkitchen at gmail.com> wrote:
>> 2. (new function(){}).constructor should be Function.
>
> I agree. And in ES3 it is, unless the function either:

No:

js> (new function(){}).constructor
function () {
}
js> function C(){}
js> new C().constructor
function C() {
}

in no case is the value of (new function(){}).constructor Function.

> - Returns another object than that it was passed from [[Construct]]
> - Creates a constructor property on the this object that is not a  
> function
> - Has it's prototype overwritten

Good points.

> 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).

>> ES4 ref impl seems a bit off:
>>
>>>> (new function F(){}).constructor
>> [function Function]

This is on file: http://bugs.ecmascript.org/ticket/64

>>>> new Date(9e9).constructor
>> [class Class]

I don't see this one on file -- someone please file it! Thanks.

>>>> 1['constructor']
>> [class Class]
>
> Seems a bit broken, yes...

This one may be covered by other tickets but filing it won't hurt.

>> It appears that es4 ref impl has the correct result for instancof  
>> on primitives
>>
>> All are true in ES4 and false in ES3:
>> true instanceof Boolean
>> "oo" instanceof String
>> 2 instanceof Number
>> null instanceof Object
>> NaN instanceof Number
>> Number.Infinity instanceof Number
>>
>> I think the change is correct. if typeof b == "boolean", b instanceof
>> boolean seems like it must be true.
>
> A bugfix, IIRC.

Incompatbile enough that we are not taking the chance -- we are  
changing this to match ES1-3, and to avoid boolean <: Boolean etc.

/be




More information about the Es4-discuss mailing list