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