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' 
  }
}

比较这些小提琴:es5es6

你说的在 es5 中是可能的在 es6 中仍然是可能的,有一件小事,如果你使用 new 关键字,然后为那个 class 创建一个新对象,如果你不使用 new 那么函数被执行。

  1. 所以当你说 var x= Bob(); 在 es5 和 es6 中,你执行构造函数,而不是创建一个新对象,因此它 returns something.

  2. 当你说,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);

这就是为什么 this doesnt work, but this 有效..

根据 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 的构造函数。此调用还将 Billthis 对象更改为由 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".