ECMAScript 2015(ECMAScript6)是否具有类初始值设定项

Does ECMAScript 2015(ECMAScript 6) have class initializer?

本文关键字:2015 ECMAScript6 是否 ECMAScript      更新时间:2023-09-26

我最近查看了ECMAScript 2015
ECMAScript 2015有类初始值设定项吗?

例如,我试图像解析器一样编写类;

class URLParser {
    parse(url) {
        let regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;
        (....)
    }
}
var a = new URLParser();
a.parse('http://example.com/abc');
a.parse('http://example.com/def');
var b = new URLParser();
b.parse('https://sample.net/abc');
b.parse('https://sample.net/def');

这个正则表达式在类中很常见,所以我只想初始化它一次
我知道使用构造函数来减少初始化,但会影响实例范围
我想知道如何简化初始化类范围

谢谢。

没有。不过,有一个关于静态属性的建议。

在此之前,您可以一如既往地向原型添加共享属性:

URLParser.prototype.regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;

并通过this.regex在您的方法中访问它。

目前无法在ES6类中创建静态属性,只能创建静态方法。


但是,您可以将属性直接附加到类,这将模拟静态属性:

class URLParser {
    parse(url) {
        URLParser.regex.match(...);
        (....)
    }
}
URLParser.regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;

它没有。有一个关于类级声明性初始化的建议,所以您可以进行

class URLParser {
    static regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;
}

然后在任何地方使用URLParser.regex来访问它。一种更好、不那么冗长的方法是利用JS作用域,只将regex放在类之前。将正则表达式附加到类没有任何好处。

let regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;
class URLParser {
  parse(url) {
    (....)
  }
}

目前没有在JavaScript中创建static属性的方法,但是,您可以在constructor 中定义属性

class URLParser {
    constructor() {
        this.regex = /(https?):'/'/([^'/]+)'/([^'?]*)'?([^#]*)#(.*)/;
    }
    parse(url) {
        this.regex.match(url)
        (...);
    }
}