let instance = Object.create(o);
instance.constructor(/* constructor args */)

This assumes that the new instance will inherit "constructor" from its 
prototype chain (possibly all the way to Object.prototype.constructor (.i.e. 
Object).
If you are careful to always code your constructors to return this, you can 
shorten it to:

let instance  = Object.create(o).constructor(/* constructor args */);

As I think I have talked about in the past.  For ES.next I think we should 
extend the semantics of new to be approximately:

function ESNewOperator( rhs, args) {
   if (rhs has [[Constructor]] ) return 
rhs.[[Constructor]].apply(undefined,args);
   let instance = Object.create(rhs);
   instance.constructor(...args);
   return instance;
}
( a few additional error conditions need to be added)

This allows the new operator  to make sense (and work in an internally 
interoperable manner) for both prototypical and classical inheritance

For example:

let proto = {
   depth: 0;
   constructor: function() {this.depth +=  1};  /* get parent's depth, 
increment it, and store as own property of instance */
}

let lev1 = new proto;
let lev2 = new lev1;
let lev3 = new lev2;

I'm being terse in my explanation, but this would essentially giving ES the 
ability to really do self-style prototypical instantiation without getting in 
the way to existing constructor-based instantiation.  Newing an arbitrary 
object creates a new instance whose [[Prototype]] is the newed object and then 
calls the inherited constructor.   The constructor method servers as the 
initialize method.  Such a constructor  can be called either explicitly as has 
traditionally been done in JS or it call be called implicitly by newing an that 
inherits its as its constructor property. 

Regarding, WebIDL.  It seems to me, that it just needs an extended attribute to 
specifies which attributes are instance attributes rather than prototype 
attributes. 

Allen




_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to