将以下代码发布到 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;
}

对我来说它看起来很好,直到我意识到它在原型(prototype) 上同时执行 Object.create setPrototypeOf 调用。我对 setPrototypeOf 不太熟悉,所以我去了 MDN 那里说:



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

这条线应该是
if (superClass && !superClass.prototype)

当原型(prototype)未设置时,但它仍然有 __proto__

最佳答案

setPrototypeOf 确实将 subClass 的 [[prototype]] 从其原始值 Function.prototype 设置为 superClass ,让它从中继承静态属性。
Object.create 不能在这里使用(就像 .prototype 对象一样),因为它不允许创建函数。显然,类的构造函数必须是一个函数;唯一的方法是使用标准表达式/声明创建函数,然后更改其原型(prototype)。

10-08 08:49