ECMAScript 2015(ECMAScript 6)有类的初始化器吗?

4

最近我学习了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');

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

谢谢。


你是指构造函数吗? - Amit
@Amit:“我知道使用构造函数可以减少初始化,但会影响整个实例。” - Felix Kling
@FelixKling - 是的,你说得对。我确实很难读懂这个问题;-) - Amit
在这种情况下,您不想调用您的超类并使用 extend 吗? - Daniel Lizik
谢谢你的回答!我发现 ECMAScript 2015 没有类级别的声明式初始化,所以还有其他方法。 - Akira Koyasu
4个回答

3

不是的。虽然有静态属性的提案

在那之前,像往常一样,您可以将共享属性添加到原型中:

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

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


但这也涉及到实例对象,要影响整个类,它将是 URLParser.regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/; - Yerko Palma
这也与实例对象相关。但它只执行一次。最终取决于您想如何访问该值。 URLParser.regex vs this.regex. - Felix Kling
1
基于这个语句“我知道使用构造函数来减少初始化,但会影响整个实例”,我猜他想像静态属性URLParser.regex一样使用它。 - Yerko Palma
也许吧。构造函数只适用于单个实例(即每个实例都有数据的副本)。因此,在构造函数中添加内容和在原型中添加内容之间仍然存在差异。我的解决方案解决了“此正则表达式在类中很常见,因此我只想初始化一次”的部分。多种选择并不会有坏处 :) - Felix Kling
1
此外,我不知道OP对“实例范围”和“类范围”的定义是什么。 - Felix Kling
在JS中,“.prototype”解决方案似乎更符合惯用法。 - nils

2

目前在ES6类中无法创建静态属性,但可以创建静态方法。


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

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

2
它并不会。有一个关于类级别声明式初始化的提案,因此您可能会这样做:
class URLParser {
    static regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;
}

然后在所有地方使用URLParser.regex来访问它。一个更好、更简洁的方法是利用JS作用域,只需将正则表达式放在类之前即可。将正则表达式附加到类上没有任何好处。

let regex = /(https?):\/\/([^\/]+)\/([^\?]*)\?([^#]*)#(.*)/;

class URLParser {
  parse(url) {
    (....)
  }
}

0

目前在JavaScript中还没有一种直接定义static属性的方法,不过你可以在constructor中定义该属性。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接