On Jan 21, 2013, at 4:44 PM, Nathan Wall wrote:

>> Object.create(new Date).getDate(); // works but is specified to not work 
> 
> I understand why this doesn't work, but why *shouldn't* it work? I'm curious 
> why the language doesn't allow for this... ? It seems reasonable at first 
> glance.


Because, the "Dateness" of an object is an characteristic of an instance not of 
what is on its inheritance  chain. 

In ES <= 5.1 this is defined in terms of the [[Class]] internal property which 
identifies the specific low level built-in form of an object.  You might think 
about it as defining the private record structure of an instance and other  
specific per instance characteristics such as which internal methods are 
applicable to the instance.

Changing the prototype (via __proto__) doesn't change the shape of the instance 
or modify its [[Class]].  That aspect (which at an implementation level, might 
impact what is actually allocated) is immutably set for each instance when it 
is allocated.  This is why the built-ins including Array in ES <=5.1 are not 
"subclassable".

In the the last couple ES6 specs drafts  there is a mechanism  defined in terms 
of @@create methods that allow subclasses to inherit such specialized instance 
allocation procedures.  This allows subclasses instance of  Array, Date, and 
other built-in to be fully functional with all the inherited built-in methods.

An ES programmer could directly invoked Date[@@alloc] like:

let newInst = Date[@@alloc]]();  //allocate a new data-like instance
Date.call(newInst);  //initialize the private date state and make the instance 
as initalized
newInst.__proto__= Object.create(Date.prototype)  //give it a new prototype 
that inherits from Data.prototype

but its much easier to just say:

let newInst = new class extends Date{};

which does pretty much the same thing.

Allen

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

Reply via email to