Por que o mapa não é subclassável no chrome / node?

Então ES 6 está nos trazendoMapas (e não tão cedo). Desejando subclassificar o Mapa para meus propósitos nefastos, tentei o seguinte (abreviado para maior clareza):

function Foo() {
    return Map.apply(this, [].slice.call(arguments));
}

var bar = new Foo();

Nos ambientes V8, isso gera um erro "Construtor de mapa não chamado com 'novo'". Por quê? SpiderMonkey faz isso "certo":

Map.call({}, [['foo', 'bar']]).get('foo');

como esperado, produzirá 'bar'. Tanto no SpiderMonkey quanto no V8, tentando algo como

function Foo() {};
Foo.prototype = new Map();
var bar = new Foo();
bar.set('foo', 'bar');

falhará: 'conjunto de métodos chamado em objeto incompatível'. Então lá vai esse padrão de herança. Tanto quanto eu posso dizer peloespecificação (Não tenho muitos detalhes), os objetos Map reais têm propriedades internas que não são acessíveis e são necessárias para que funcionem corretamente. Mas por que o V8 gera um erro no primeiro padrão? Parece uma decisão estranha, especialmente quando funciona como esperado no FF.

ATUALIZAÇÃO: notei que o FF e o Chrome têmObject.setPrototypeOf implementado. Apenas no caso de alguém tropeçar nisso e pensar nisso, posso lhe dizer que falha. Ambos os seguintes falham por diferentes motivos:

//this totally fails, even for custom constructors/objects
var Foo = function(){};
Object.setPrototypeOf(Foo, Map.prototype);
var bar = new Foo(); //bar doesn't have any of the Map properties/methods

//this one has the methods but still throws the 'incompatible object'
//err. Also fails with new Map() instead of Map.prototype
var bar = Object.setPrototypeOf({}, Map.prototype); 
TL; DR

Existem basicamente quatro maneiras de estender o mapa (algumas das respostas / comentários abaixo):

Adicione métodos ao Map.prototype (que vergonha).O Factory / construtor cria objetos com uma instância interna do Map que você delega paraMixin fn que copia propriedades no Maps:
function Foo(){this.bar = 'boo!'}
var baz = new Map();
Foo.call(baz);
baz.bar; //yields 'boo!'
baz.set('5', 5).get('5'); //yields 5

Ou apenas espere que as classes do ES 6 atinjam a (s) plataforma (s) de sua preferência

questionAnswers(4)

yourAnswerToTheQuestion