ECMAScript proposal function callable classes
本文介绍了建议性ECMAScript功能:调用构造函数
ECMAScript 建议:函数可调用的类
原文 ECMAScript proposal: function-callable classes
1. 类在ES6中不能作为函数调用
在ECMAScript6中,类不能像普通函数一样调用:
class Point {
constructor(x, y){
this.x = x;
this.y = y;
}
}
let p1 = new Point(1, 2) //OK
let p2 = Point(3, 4) //TypeError
ES6,并没有明确反对类被像函数一样调用,这个错误只有在处理函数通过类调用时抛出。
2. ES6中的函数可调用的构造函数
如果你想实现一个构造函数Point 可以像函数一样调用同时可以像构造函数一样调用,你只能使用ES6中的构造函数。
function Point(x, y){
if(!new.target) {
//Point was function-called
return new Point(x, y);
}
this.x = x;
this.y = y;
}
let p1 = new Point(1, 2); //OK
let p2 = Point(3, 4); //OK
函数可调用的 类 通过 建议的 call constructor
建议是允许类处理函数调用通过预处理方法 call constructor()
function Point(x, y){
constructor(x. y){
this.x = x;
this.y = y;
}
call constructor(x, y){
return new Point(x, y);
}
}
let p1 = new Point(1, 2); //OK
let p2 = Point(3, 4); //OK
注意事项:
- 一个call constructor 不能被子类继承,你必须在每个想被可以函数式调用的类中放置它
- super()调用在一个call constructor中会产生编译错误()就像它在其他普通方法中.这样是为了保持选项打开读写等保证super()在call constructor中的功能
4. 可能添加到建议中的功能
4.1 新的meta属性
在这个建议的未来某个版本中,两个peta属性可能会被添加进来:
- class.current 指向当前的类(一个函数)
- class.extends 指向当前类的父类.
class.current 将会帮助从call constructor 中指向 constructor
class Foo(){
constructor(...){
...
}
call constructor(...args){
return new class.current(...args)
}
}
4.2 通过修饰符使类 函数可调用化
另一种可能是 一个类型修饰符 来使 类变得函数可调用,比如
@callConstructor
class Foo(){
constructor(...){
...
}
}
Written on October 29, 2015