使用通用EcmaScript 5扩展ES6本机类

时间:2017-03-27 08:12:54

标签: javascript class ecmascript-6 ecmascript-5

是的,这个问题是关于使用Es5扩展使用class关键字声明的本机Es6类,并且 not 已转换为Es5和not the other way around

为什么有人这样做?我有一个库需要严格的Es5,但该库的用户可能正在使用Es6本机类,至少可能在开发期间没有使用转换器。现在,该库包含一个功能,其中给定了这样一个类,它需要动态创建该类的子类,但不使用class关键字,更具体地说,不使用super关键字。但是,正确的子类实​​现需要调用超级构造函数,在这种情况下,它将是Es6类的构造函数,而在Es6中将不使用super关键字。

从Es5的角度来看,Es6基类是一个简单的函数(构造函数),但是我没有看到如何正确调用该函数的方法。

有没有办法在不使用eval的情况下在Es5兼容的源代码文件中调用Es6构造函数 - 就像编程一样?

  //Es6 Code class declaration
  class BaseClass {
    constructor(foo){
      this.foo = foo;
    }
  }

  // "Typescript-Es5-extends-style" helper method
  var __extends = (this && this.__extends) || (function () {
        var extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return function (d, b) {
          extendStatics(d, b);
          function __() { this.constructor = d; }
          d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
      })();

  // subclass declaration
  var SubClass = (function (_super) {
    __extends(SubClass, _super);
    function SubClass() {
      // Error: super keyword unexpected
      //super();

      // Error: Class constructor BaseClass cannot be invoked without 'new'
      // BaseClass();
      // return Function.prototype.bind.apply(_super, [this].concat(arguments))();
      return _super.apply(this, arguments) || this;
    }
    return SubClass;
  }(BaseClass));

  // Instantiation  
  // won't work (Class constructor BaseClass cannot be invoked without 'new')
  new SubClass();

0 个答案:

没有答案