将以下代码发布到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__
?
答案 0 :(得分:9)
setPrototypeOf
确实将subClass
的[[原型]]从原始值Function.prototype
设置为superClass
,让它从中继承静态属性。
Object.create
(就像.prototype
对象一样),因为它不允许创建函数。显然,类的构造函数必须是一个函数;并且唯一的方法是使用标准表达式/声明创建函数,然后在之后更改其原型。