Класс ES6, расширяющий собственный тип, заставляет instanceof вести себя неожиданно в некоторых механизмах JavaScript?

Рассмотрим следующие классы ES6:

'use strict';

class Dummy {
}

class ExtendDummy extends Dummy {
    constructor(...args) {
        super(...args)
    }
}

class ExtendString extends String {
    constructor(...args) {
        super(...args)
    }
}

const ed = new ExtendDummy('dummy');
const es = new ExtendString('string');

console.log(ed instanceof ExtendDummy);
console.log(es instanceof ExtendString);

Насколько я понимаю, оба должны быть true, а в Firefox и Chrome они есть, однако Node говорит, что es instanceof ExtendString равно false. То же самое и с другими конструкторами, а не только с String.

Программное обеспечение, которое я использовал:

  • Узел v5.11.0 с флагом --harmony.
  • Хром 50
  • Фаерфокс 45

Какой движок JavaScript правильный и почему?


person Alexander O'Mara    schedule 26.04.2016    source источник
comment
Node.js имеет более старую версию v8, чем Chrome, поэтому я ожидаю, что ошибка будет в node. Кстати, вы можете попробовать Node.js 6.0.   -  person Qwertiy    schedule 26.04.2016
comment
Просто собираюсь повторить себя несколько раз здесь.   -  person Alexander O'Mara    schedule 20.12.2016
comment
Просто повторюсь здесь несколько раз - зачем?   -  person Qwertiy    schedule 20.12.2016
comment
@Qwertiy Слухи о шляпах. Извините за уведомление.   -  person Alexander O'Mara    schedule 20.12.2016
comment
Что это за шляпа?   -  person Qwertiy    schedule 20.12.2016
comment
@Qwertiy Bluefeet может быть, но я этого не понял, поэтому думаю, что это был провал.   -  person Alexander O'Mara    schedule 20.12.2016


Ответы (1)


Узел кажется неверным, es instanceof ExtendString определенно должен быть true (как и все ожидали).

String[Symbol.hasInstance] не перезаписывается, а Object.getPrototypeOf(es) должно быть ExtendedString.prototype, поскольку спецификация подробно описывает это в String (value) описание функции:

  1. Вернуть StringCreate(s, GetPrototypeFromConstructor(NewTarget, "%StringPrototype%")).

newtarget ссылается на ExtendString при создании экземпляра new ExtendString('string'), и поскольку это конструктор с объектом .prototype, он будет использовать ExtendedString.prototype не %StringPrototype как [[прототип]] для недавно созданного экзотического объекта String:

  1. Установите [[Prototype]] внутренний слот от S до prototype.
person Bergi    schedule 26.04.2016
comment
Должно быть, это старая ошибка V8, я посмотрю, смогу ли я ее найти. - person Alexander O'Mara; 26.04.2016
comment
Не могу найти никаких ошибок в этом, но я думаю, что можно с уверенностью предположить, что это была бывшая ошибка в V8. - person Alexander O'Mara; 27.04.2016