Return ES6 中 class 以外的值
Return a value other than the class in ES6
最近我一直在用 ES6 测试 classes,我注意到在创建 class 时你不能指定构造函数给出的值。
以前在 ES5 中这是可能的。
在这两种情况下,我都会用 new MyClass
实例化 class
我想这样做的原因是我可以 return 当前 class 的一个子集,其中只有功能。
ES5 - returns My class was init with: Blah
var MyClass = function() {
this.initVar = 'Blah'
return 'My Class was init with: ' + this.initVar
}
ES6 - returns {}
class Bob {
constructor() {
return 'hello'
}
}
你说的在 es5 中是可能的在 es6 中仍然是可能的,有一件小事,如果你使用 new 关键字,然后为那个 class 创建一个新对象,如果你不使用 new 那么函数被执行。
所以当你说 var x= Bob();
在 es5 和 es6 中,你执行构造函数,而不是创建一个新对象,因此它 returns something.
当你说,var x= new Bob();
,你得到一个新对象,由构造函数初始化。
这适用于 es5 和 es6,因为 es6 classes 没有什么新东西,只是为了语法而引入。
编辑:如果扩展classes:
您不能只在 es6 中扩展 class 并期望调用超级构造函数,您需要在子 class 构造函数中显式调用它。请参阅代码:
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);
根据 TC39 网站的 Class article,ES6 class 语法有一个隐式构造函数,如果 class 定义中没有提供此类函数,则会调用该函数。
这可以通过提供您自己的构造函数和 returning 您想要的任何对象来覆盖,例如:
class Bob {
constructor(name) {
return {hi: name}; // returns an object other than *this*.
}
}
进行中:
var bob = new Bob('bob');
console.log(bob.hi); // 'bob'
要扩展 class,您可以这样做:
class Bill extends Bob {
}
但是 extends 也有一个隐式构造函数,因此它将 return 一个继承自 Bill 的新实例=43=]Bob.prototype。由于 hi 是在构造函数中定义的而不是继承的,所以你得到:
var bill = new Bill('bill');
console.log(bill.hi); // undefined
要像 Bob 一样初始化 Bill,提供调用 super 的构造函数。此调用还将 Bill 的 this 对象更改为由 super 编辑的值 return , 例如
class Bill extends Bob {
constructor(name) {
super(name);
}
}
现在:
var bill = new Bill('bill');
console.log(bill.hi); // bill
还值得注意的是,class声明的主体总是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
ES6
实际上不是 return {}
而是 class (constructor) 对象。 class 构造函数可以 return 对象,但不能是原始值。所以 return 不是 [String] "hello"
,而是 [Object] Bob
。任何值都可以这样 returned:
class Bob {
constructor() {
return ()=>'hello';
}
}
const bob = new Bob()();
returned [函数],因为它是一个对象,所以可以 returned 并立即触发 return 一些原始值,例如。 [字符串] "hello"
.
最近我一直在用 ES6 测试 classes,我注意到在创建 class 时你不能指定构造函数给出的值。
以前在 ES5 中这是可能的。
在这两种情况下,我都会用 new MyClass
实例化 class
我想这样做的原因是我可以 return 当前 class 的一个子集,其中只有功能。
ES5 - returns My class was init with: Blah
var MyClass = function() {
this.initVar = 'Blah'
return 'My Class was init with: ' + this.initVar
}
ES6 - returns {}
class Bob {
constructor() {
return 'hello'
}
}
你说的在 es5 中是可能的在 es6 中仍然是可能的,有一件小事,如果你使用 new 关键字,然后为那个 class 创建一个新对象,如果你不使用 new 那么函数被执行。
所以当你说
var x= Bob();
在 es5 和 es6 中,你执行构造函数,而不是创建一个新对象,因此它 returns something.当你说,
var x= new Bob();
,你得到一个新对象,由构造函数初始化。
这适用于 es5 和 es6,因为 es6 classes 没有什么新东西,只是为了语法而引入。
编辑:如果扩展classes: 您不能只在 es6 中扩展 class 并期望调用超级构造函数,您需要在子 class 构造函数中显式调用它。请参阅代码:
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);
根据 TC39 网站的 Class article,ES6 class 语法有一个隐式构造函数,如果 class 定义中没有提供此类函数,则会调用该函数。
这可以通过提供您自己的构造函数和 returning 您想要的任何对象来覆盖,例如:
class Bob {
constructor(name) {
return {hi: name}; // returns an object other than *this*.
}
}
进行中:
var bob = new Bob('bob');
console.log(bob.hi); // 'bob'
要扩展 class,您可以这样做:
class Bill extends Bob {
}
但是 extends 也有一个隐式构造函数,因此它将 return 一个继承自 Bill 的新实例=43=]Bob.prototype。由于 hi 是在构造函数中定义的而不是继承的,所以你得到:
var bill = new Bill('bill');
console.log(bill.hi); // undefined
要像 Bob 一样初始化 Bill,提供调用 super 的构造函数。此调用还将 Bill 的 this 对象更改为由 super 编辑的值 return , 例如
class Bill extends Bob {
constructor(name) {
super(name);
}
}
现在:
var bill = new Bill('bill');
console.log(bill.hi); // bill
还值得注意的是,class声明的主体总是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
ES6
实际上不是 return {}
而是 class (constructor) 对象。 class 构造函数可以 return 对象,但不能是原始值。所以 return 不是 [String] "hello"
,而是 [Object] Bob
。任何值都可以这样 returned:
class Bob {
constructor() {
return ()=>'hello';
}
}
const bob = new Bob()();
returned [函数],因为它是一个对象,所以可以 returned 并立即触发 return 一些原始值,例如。 [字符串] "hello"
.