最近我一直在测试ES6的课程,我注意到在创建课程时你不能指定构造函数给出的值。
以前在ES5中这是可能的。
在这两种情况下,我都会使用new MyClass
实例化该类
我想这样做的原因是我可以返回当前类的子集,只有函数。
My class was init with: Blah
var MyClass = function() {
this.initVar = 'Blah'
return 'My Class was init with: ' + this.initVar
}
{}
class Bob {
constructor() {
return 'hello'
}
}
答案 0 :(得分:26)
根据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 的此对象更改为 super 返回的值,例如
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
答案 1 :(得分:0)
你在es6中说的可能性仍然可以在es6中,如果你使用new关键字,那么会创建一个小的东西,然后创建该类的新对象,如果你不是新的,那么执行该函数。 / p>
所以当你在es5和es6中都说var x= Bob();
时,你执行构造函数,而不是创建一个新对象,因此返回一些东西。
当你说var x= new Bob();
时,你得到一个新的对象,由构造函数初始化。
这适用于es5和es6,因为es6类没有什么新功能,但只是为了语法而引入。
修改:如果要扩展课程: 你不能只在es6中扩展一个类,并期望调用超级构造函数,你需要在子类构造函数中显式调用它。参见代码:
class Bob {
constructor() {
return {hi: 'bob'}
}
}
class Bill extends Bob {
constructor() {
return super();// here you should retun the called super constructer
}
}
var x= Bob();
console.log(Bob);
x= new Bill();
console.log(x.hi);
答案 2 :(得分:0)
The ES6
actually does not return {}
but the class (constructor) object in that case. The class constructor can return objects, but not primitive values. So instead of [String] "hello"
it returns [Object] Bob
. Any value can be returned this way:
class Bob {
constructor() {
return ()=>'hello';
}
}
const bob = new Bob()();
The returned [Function], as it is an object, can be returned and immediately fired to return some primitive value, eg. [String] "hello"
.