On Nov 19, 2012, at 8:00 AM, David Bruant wrote:

> Le 19/11/2012 14:38, Boris Zbarsky a écrit :
>> On 11/19/12 2:36 AM, David Bruant wrote:
>>> ...
> 
>>>> I suppose the same goes for ES6 Map.
>>> As Tab suggested, a Map subclass could certainly work
>> 
>> How close are "subclasses" to not being vaporware (both in spec and 
>> implementation terms)?
> I don't understand what you mean by vaporware. ES6 Maps are a reality in 
> Firefox and Chrome (behind a flag for the latter). Subclassing of ES6 maps 
> will be possible as soon as ES6 classes do (which I admit are still 
> unimplemented)... well... it's actually possible today with __proto__ I guess.

In the ES6 draft, the Map built-in constructor is explicitly defined to be 
"subclassable". This is done in a manner that does not require the use of ES6 
class declarations.  It simply means that if an arbitrary object is initialized 
by calling the Map constructor (as a function) on the object then the object 
will have the necessary internal state to act as a map object and the built-int 
Map.prototype methods that depend upon such state will work with the object.

Practically it means things like this:

class SpecialMap extends Map {
   constructor(...args) {super(...args)};
   set(key,value) {
        super.set(key,value);
        DoSomethingSpecialWhenSettingAMapElement(this,key,value);
    }
}


or without class declarations

SpecialMap.prototype = Object.create(Map.prototype); 
SpecialMap.prototype.constructor = SpecialMap;
function SpecialMap() {
      Map.call(this);      // initialize new object with internal state needed 
to operate as a map
}
SpecialMap.prototype.set = function(key,value) {
   Map.prototype.set.call(this,key,value);
   DoSomethingSpecialWhenSettingAMapElement(this,key,value);
}

The necessary mechanisms to make this work are specified but as far as I know 
have not yet been implemented.  I'm hopeful that they will soon be incorporated 
into one or more of the experimental Map implementations. 

Allen

Reply via email to