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

时间:2016-06-20 15:58:40

标签: javascript inheritance ecmascript-6 babeljs

将以下代码发布到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调用上同时执行setPrototypeOf之前,我看起来很好。我对setPrototypeOf并不熟悉所以我去了MDN所说的地方:

  

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

因为他们使用两者,所以这让我感到困惑。为什么会这样?

该行应该是

if (superClass && !superClass.prototype)

原型何时未设置,但仍有__proto__

1 个答案:

答案 0 :(得分:9)

setPrototypeOf确实将subClass的[[原型]]从原始值Function.prototype设置为superClass,让它从中继承静态属性。

这里不能使用

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