我最近查看了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');
这个正则表达式在课堂上很常见,所以我只想初始化一次。
我知道使用构造函数来减少初始化,但会影响实例范围
我想知道如何减少初始化类宽。
谢谢。
答案 0 :(得分:3)
不。 There is a proposal for static properties though
在此之前,您可以像往常一样将共享属性添加到原型中:
URLParser.prototype.regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
并通过this.regex
在您的方法中访问它。
答案 1 :(得分:2)
目前无法在ES6类中创建静态属性,只能在静态方法中创建静态属性。
但是您可以将属性直接附加到类,这将模拟静态属性:
class URLParser {
parse(url) {
URLParser.regex.match(...);
(....)
}
}
URLParser.regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
答案 2 :(得分:2)
没有。有一个类级声明初始化的提议,所以你可能会做
class URLParser {
static regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
}
然后在任何地方使用URLParser.regex
来访问它。一个更好,更简洁的方法是利用JS范围,并将正则表达式放在课前。将正则表达式附加到类中没有任何好处。
let regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
class URLParser {
parse(url) {
(....)
}
}
答案 3 :(得分:0)
目前无法在JavaScript中生成static
属性,但是,您可以在constructor
class URLParser {
constructor() {
this.regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
}
parse(url) {
this.regex.match(url)
(...);
}
}