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