JavaScript синтаксис класса, добавленный в ES6, по-видимому, делает его законным для extend null
:
class foo extends null {}
Некоторый Googling показывает, что он предложил на ES Обсудить, что такие объявления должны быть сделаны ошибкой; однако другие комментаторы утверждали, что они оставлены законными на том основании, что
кто-то может захотеть создать класс с прототипом
{__proto__: null}
и эта сторона аргумента в конечном итоге преобладала.
Я не могу полностью понять этот гипотетический вариант использования. Во-первых, хотя объявление такого класса является законным, кажется, что создание экземпляра класса, объявленного таким образом, не является. Попытка создать экземпляр класса foo
сверху в Node.js или Chrome дает мне чудесную ошибку
TypeError: function is not a function
делая то же самое в Firefox, дает мне
TypeError: function () {
} is not a constructor
Это не помогает определить конструктор класса, как показано в текущем примере MDN функции; если я попытаюсь создать экземпляр этого класса:
class bar extends null {
constructor(){}
}
затем Chrome/ Node скажите мне:
ReferenceError: this is not defined
и Firefox сообщает мне:
ReferenceError: |this| used uninitialized in bar class constructor
Что это за безумие? Почему эти классы, несущие нуль, несовместимы? И учитывая, что они не являются реальными, почему появилась возможность их создания умышленно ушла в спецификацию, и почему какой-то автор MDN подумал, что это достаточно примечательно для документирования? Какой возможный вариант использования для этой функции?