Почему карта не подклассифицируется в chrome / node?

Итак, ES 6 приносит намКарты (и не слишком рано). Желая создать подкласс Map для своих собственных гнусных целей, я попробовал следующее (сокращенно для ясности):

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

var bar = new Foo();

В средах V8 это выдает ошибку «Конструктор карты не вызван с« новым »». Зачем? SpiderMonkey получает это «правильно»:

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

будет, как и ожидалось, даст «бар». И в SpiderMonkey, и в V8 пытается что-то вроде

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

потерпит неудачу: 'набор методов вызван для несовместимого объекта'. Таким образом, идет этот образец наследования. Насколько я могу судить поспекуляция (У меня нет особых спецификаций), у реальных объектов Map есть внутренние свойства, которые не доступны, которые необходимы для их правильной работы. Но почему V8 выдает ошибку на первом шаблоне? Это кажется странным решением, особенно когда оно работает так, как ожидалось в FF.

ОБНОВЛЕНИЕ: я заметил, что FF и хром оба имеютObject.setPrototypeOf реализованы. На всякий случай, если кто-нибудь наткнется на это и подумает об этом, я могу сказать, что это не удалось. Оба следующих сбоя по разным причинам:

//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

Есть в основном четыре способа расширить карту (некоторые из ответов / комментариев ниже):

Добавить методы в Map.prototype (как вам не стыдно).Фабрика / конструктор создает объекты с внутренним экземпляром Map, которому вы делегируетеMixin fn, который копирует свойства на Карты:
function Foo(){this.bar = 'boo!'}
var baz = new Map();
Foo.call(baz);
baz.bar; //yields 'boo!'
baz.set('5', 5).get('5'); //yields 5

Или просто подождите, пока классы ES 6 появятся на платформе (ах), о которой вы заботитесь

Ответы на вопрос(0)

Ваш ответ на вопрос