Является ли новый super.constructor допустимым выражением в JavaScript? - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы знать, допустимы ли выражения вида new super.SomeProperty в JavaScript.

Этот вопрос возник при работе с кодом, который ведет себя непоследовательно во всех браузерах, как, например, в приведенном ниже фрагменте кода.

class Test {
    test() {
        return new super.constructor;
    }
}

console.log((new Test).test());

Это печатает пустой объект в Firefox и Edge, но выбрасывает ReferenceError в Chrome и SyntaxError в Safari. Эту ошибку можно легко обойти, поставив скобки вокруг super.constructor или используя переменную, так что это не является реальным ограничением, а скорее вопросом любопытства в отношении самого языка. Я проверил спецификацию, но не смог найти ничего, что указывало бы на то, что в этом случае должна быть выдана ошибка, поэтому, скорее всего, я что-то упустил.

1 Ответ

0 голосов
/ 11 мая 2018

Согласно MDN Статья приоритета оператора Новое без списка аргументов ниже, чем доступ к элементу.Это говорит о том, что new super.constructor следует оценивать как new (super.constructor), а Firefox и Edge верны.

Теперь, в соответствии со спецификациями:

new super.constructor равно new NewExpression (https://tc39.github.io/ecma262/#sec-new-operator). NewExpression имеет форму MemberExpression , которая имеет форму SuperProperty , которая имеет форму super . IdentifierName . Стандарт ES6, кажется, говорит то же самое. Поэтому мне кажется, что MDN верен, и поэтому Firefox и Edge соответствуют спецификации.

...