为什么Babel在已经使用Object.create(superClass.prototype)时使用setPrototypeOf进行继承?

m0m*_*eni 7 javascript inheritance ecmascript-6 babeljs

将以下代码发布到Babel REPL中

class Test {

}

class Test2 extends Test {

}
Run Code Online (Sandbox Code Playgroud)

你得到这个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;
}
Run Code Online (Sandbox Code Playgroud)

它看起来没什么问题,直到我意识到这是做既Object.create对原型一个setPrototypeOf电话.我不熟悉setPrototypeOf所以我去了MDN,它说:

如果您关心性能,则应避免设置对象的[[Prototype]].相反,使用Object.create()创建具有所需[[Prototype]]的新对象.

这对我来说很困惑,因为他们同时使用两者.为什么会这样?

应该换行

if (superClass && !superClass.prototype)
Run Code Online (Sandbox Code Playgroud)

当原型未设置时,它仍然有一个__proto__

Ber*_*rgi 9

setPrototypeOf不设置[[原型]的subClass从原来的价值Function.prototypesuperClass,让它继承它的静态属性.

Object.create这里不能使用(就像它.prototype对象一样),因为它不允许创建函数.显然,类的构造函数必须是一个函数; 并且唯一的方法是使用标准表达式/声明创建函数,然后更改其原型.

  • 从中继承属性的[[prototype]]与构造函数的`.prototype`属性不同.http://stackoverflow.com/q/9959727/1048572 (2认同)
  • @ AR7 [这是一个显示静态方法如何工作的例子.](https://jsfiddle.net/dk35aasr/)基本上,你只能通过引用"类"本身而不是通过该类的任何实例来访问它们.这就是为什么你不希望它们出现在原型上. (2认同)