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

Brendan Eich brendan at mozilla.com
Fri Dec 14 13:08:18 PST 2007


On Dec 14, 2007, at 12:50 PM, P T Withington wrote:

> On 2007-09-23, at 14:14 EDT, Brendan Eich wrote:
>
>> 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.
>
> So, was nothing done about this?  We're starting to work on an es4
> back-end for our stuff and running into this issue.  We can make sure
> all our constructors give each instance a constructor slot (and we can
> smash the class prototype.constructor to point to the superclass) as
> we do for our es3 back end; but I was really hoping for a cleaner
> solution in es4.

Nothing's changed, no proposal that avoids per-instance overhead or  
more complicated implementation strategies to avoid that. There's  
also an entrainment hazard, not huge but non-zero risk of introducing  
leaks into existing web apps if we entrain the constructor where the  
web app code intentionally clears prototype.constructor (which is  
read/write).

The constructor property is and always was intended to be a property  
of the prototype, not of each instance. Changing that now is hard.  
The merits are not compelling enough IMHO.

> Is there some other way in es4 that from an instance one can navigate
> up the superclass chain?  Can I say:
>
>    super.constructor
>
> perhaps, to find my class's superclass?

For a class C, C.prototype.constructor is indeed C. But super does  
not work that way -- it's used for invoking the super-class  
constructor, rather:

 >> class B { var x;function B(x) : x=x {} }
 >> new B(2).x
2
 >> class D extends B { var y; function D(x,y) : y=y, super(x) {} }
 >> d = new D(3,4)
[object D]
 >> d.x
3
 >> d.y
4

To reflect on inheritance and other relations, use the meta-objects  
interfaces:

http://wiki.ecmascript.org/doku.php?id=proposals:meta_objects

Given class C:

let Ctype = reflect::typeOf(C);
for (let Csup in Ctype.superTypes()) {
     // Csup is a base class or interface of C here
}

/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.mozilla.org/pipermail/es-discuss/attachments/20071214/45254d21/attachment-0002.html 


More information about the Es4-discuss mailing list