ECMAScript 2015(ECMAScript 6)是否具有类初始化程序?

时间:2016-05-02 18:32:54

标签: javascript class ecmascript-6

我最近查看了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');

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

谢谢。

4 个答案:

答案 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)
        (...);
    }
}