首页 > 编程语言> > javascript-当Babel已经使用Object.create(superClass.prototype)时,为什么Babel使用setPrototypeOf进行继承?
javascript-当Babel已经使用Object.create(superClass.prototype)时,为什么Babel使用setPrototypeOf进行继承?
作者:互联网
将以下代码发布到Babel REPL中
class Test {
}
class Test2 extends Test {
}
你得到这个继承功能
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,上面写着:
If you care about performance you should avoid setting the [[Prototype]] of an object. Instead, create a new object with the desired [[Prototype]] using Object.create().
由于它们同时使用,这使我感到困惑.为什么会这样呢?
该行应改为
if (superClass && !superClass.prototype)
何时取消原型,但仍具有__proto__?
解决方法:
setPrototypeOf确实将子类的[[prototype]]从其原始值Function.prototype设置为superClass,以使其继承其静态属性.
因为不能创建函数,所以不能在此处使用Object.create(就像用于.prototype对象一样).显然,一个类的构造函数必须是一个函数.唯一的方法是使用标准表达式/声明创建函数,然后再更改其原型.
标签:javascript,ecmascript-6,babeljs,inheritance 来源: https://codeday.me/bug/20191010/1888176.html