编程语言
首页 > 编程语言> > 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