Почему Babel использует setPrototypeOf для наследования, когда он уже использует Object.create (superClass.prototype)?

Размещение следующего кода вBabel REPL

class Test {

}

class Test2 extends Test {

}

Вы получаете этоinherits функция

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.create по прототипуа также a setPrototypeOf вызов. Я не был знаком сsetPrototypeOf поэтому я пошел вMDN где сказано:

Если вы заботитесь о производительности, вам следует избегать установки [[Prototype]] объекта. Вместо этого создайте новый объект с желаемым [[Prototype]], используя Object.create ().

Что меня смущает, так как они используют оба. Почему это так?

Если линия вместо

if (superClass && !superClass.prototype)

когда прототип не установлен, но он все еще имеет__proto__?

Ответы на вопрос(1)

Решение Вопроса

setPrototypeOf устанавливает [[prototype]] изsubClass от первоначальной стоимостиFunction.prototype вsuperClass, чтобы позволить ему наследовать статические свойства от него.

Object.create не может быть использован здесь (как это для.prototype объект), так как не позволяет создавать функции. Конструктор класса должен быть функцией, хотя, очевидно; и единственный способ сделать это - создать функции с использованием стандартных выражений / объявлений, а затем изменить их прототип.

 Bergi20 июн. 2016 г., 18:47
Ну, вы можете сделатьObject.create(superClass), но это создает объект (как говорит имя метода), а неsubClass функция. Статические методы не хранятся ни на одном__proto__они хранятся в самом конструкторе. Они не хранятся на.prototype потому что они не должны наследоваться экземплярами.
 Bergi20 июн. 2016 г., 18:34
@ AR7: статические методы определены в объекте функции конструктора класса, а не в.prototype объект. Здесь речь идет о конструкторах, наследующих друг от друга, а не о цепочке прототипов экземпляров.
 Bergi20 июн. 2016 г., 18:53
[[Prototype]], от которого наследуются свойства, отличается от.prototype свойство конструкторов.stackoverflow.com/q/9959727/1048572
 Mike Cluck20 июн. 2016 г., 18:56
@ AR7Вот пример, показывающий, как работают статические методы. По сути, вы можете получить к ним доступ только путем обращения к самому «классу», а не через какие-либо экземпляры этого класса. Вот почему вы не хотите их на прототипе.
 m0meni20 июн. 2016 г., 18:49
«Они не хранятся в .prototype, потому что они не должны наследоваться экземплярами». Это смутило меня немного больше. Чем это отличается от «setPrototypeOf действительно устанавливает [[prototype]] для подкласса из своего исходного значения Function.prototype в superClass, чтобы позволить ему наследовать статические свойства от него». Я думал, что весь смысл в том, чтобы наследовать статические методы?
 m0meni20 июн. 2016 г., 18:40
О, так под статическим вы имели в видуэтот, ТакObject.create позволяет вам наследовать методы-прототипы, но не методы, определенные с помощьюstatic ключевое слово, правильно? Хотя мне любопытно ... почему статические методы хранятся на__proto__ объект вместо прототипа?
 m0meni20 июн. 2016 г., 18:29
Хм, это немного смущает меня. Не могли бы вы создать пример кода недостатковObject.create()? Из того, что я читаю наMDN, он будет наследовать статические методы, так как это просто методы, определенные в прототипе исходного класса, верно?

Ваш ответ на вопрос