Функция _inherits Babel после транспиляции

1

Привет, я плохо разбираюсь в английском. Но я не могу получить ответ на вопрос... У меня есть код ES2015:

class Animal{}
class Rabbit extends Animal{}

После трансляции этого кода я получаю функцию _inherits. Я просто не понимаю, что делает последнее выражение:

if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;

По-моему, последнее, но одно, делает то же самое. Все вместе:

function _inherits(subClass, superClass) {
    if (typeof superClass !== "function" && superClass !== null) {
        throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
    }
    subClass.prototype = Object.create(superClass && superClass.prototype, {
        constructor: {
            value: subClass,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
    if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
Теги:

1 ответ

0
Лучший ответ

Код в основном вызывает Object.setPrototypeOf (ES6) и возвращается к __proto__ для браузеров preES6. Это падение не является значением по умолчанию, поскольку __proto__ - это свойство, которое на самом деле не существует. Он был добавлен в спецификацию, чтобы создать согласованность между браузерами, Chrome добавил ее как "экспериментальный, не делайте этого", затем она была добавлена в спецификацию, как она обычно использовалась. Вместе с __proto__ вы можете сломать много вещей, не говоря уже о каждой оптимизации, которую может сделать браузер:

 Function.prototype.__proto__ = new Proxy({}, { get(k){ return "test" } });

 console.log((function() { }).t);

поэтому использование __proto__ вызывает некоторые проблемы для браузера, поскольку он должен откатить почти все оптимизации. Object.setPrototypeOf однако был добавлен специально для языка и имеет более строгое и, следовательно, не рискованное использование, использование его приведет к нарушению некоторых оптимизаций, но не ко всем, поэтому гораздо лучше использовать это, если это возможно.

  • 0
    Спасибо! Но я не понимаю, почему SubClass .__ proto __ получает значение SuperClass в этом примере?
  • 0
    @ Андрей, чтобы SubClass наследовал все статические свойства / методы от SuperClass
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню