最近我一直在使用ES6测试类,我注意到,创建一个类时,你不能指定构造函数给出的值.
以前在ES5这是可能的.
在这两种情况下,我将使用新的MyClass来实例化该类
我想要这样做的原因是,我可以返回当前类的一个子集,只有它的功能.
ES5 – 返回我的类是init与:Blah
var MyClass = function() { this.initVar = 'Blah' return 'My Class was init with: ' + this.initVar }
ES6 – 返回{}
class Bob { constructor() { return 'hello' } }
解决方法
根据TC39网站的
Class article,ES6类语法有一个隐式构造函数,如果在类定义中没有提供这样的函数,则会调用它.
这可以通过提供自己的构造函数和返回任何你想要的对象来覆盖,例如:
class Bob { constructor(name) { return {hi: name}; // returns an object other than *this*. } }
行动中:
var bob = new Bob('bob'); console.log(bob.hi); // 'bob'
要扩展课程,你可以做:
class Bill extends Bob { }
但是extends也有一个隐式的构造函数,所以它将返回一个继承自Bob.prototype的Bill的新实例.由于hi是在构造函数中定义的,而不是继承,你可以得到:
var bill = new Bill('bill'); console.log(bill.hi); // undefined
初始化与Bob相同的Bill,提供一个调用super的构造函数.该调用还将Bill的该对象更改为超级返回的值,例如.
class Bill extends Bob { constructor(name) { super(name); } }
现在:
var bill = new Bill('bill'); console.log(bill.hi); // bill
值得注意的是,一个classDeclaration的主体始终是strict mode code.
作为一个可运行的代码段:
class Bob { constructor(name) { return {hi: name}; // returns an object other than *this*. } } var bob = new Bob('bob'); console.log(bob.hi); // 'bob' class Bill extends Bob { constructor(name) { super(name); } } var bill = new Bill('bill'); console.log(bill.hi); // bill