Привет, я плохо разбираюсь в английском. Но я не могу получить ответ на вопрос... У меня есть код 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;
}
Код в основном вызывает Object.setPrototypeOf
(ES6) и возвращается к __proto__
для браузеров preES6. Это падение не является значением по умолчанию, поскольку __proto__
- это свойство, которое на самом деле не существует. Он был добавлен в спецификацию, чтобы создать согласованность между браузерами, Chrome добавил ее как "экспериментальный, не делайте этого", затем она была добавлена в спецификацию, как она обычно использовалась. Вместе с __proto__
вы можете сломать много вещей, не говоря уже о каждой оптимизации, которую может сделать браузер:
Function.prototype.__proto__ = new Proxy({}, { get(k){ return "test" } });
console.log((function() { }).t);
поэтому использование __proto__
вызывает некоторые проблемы для браузера, поскольку он должен откатить почти все оптимизации. Object.setPrototypeOf
однако был добавлен специально для языка и имеет более строгое и, следовательно, не рискованное использование, использование его приведет к нарушению некоторых оптимизаций, но не ко всем, поэтому гораздо лучше использовать это, если это возможно.
SubClass .__ proto __
получает значениеSuperClass
в этом примере?