2016-05-02 4 views
4

Недавно я просмотрел ECMAScript 2015.
Имеет ли в ECMAScript 2015 инициализатор класса?Имеет ли ECMAScript 2015 (ECMAScript 6) инициализатор класса?

Например, я попытался написать класс как синтаксический анализатор;

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

Вы имеете в виду конструктора ?? – Amit

+0

@Amit "*" Я знаю, что использовать конструктор для сокращения инициализации, но влияет на экземпляр широкий. "* –

+0

@FelixKling - да, вы правы. Мне действительно было трудно прочитать вопрос ;-) – Amit

ответ

3

Nope. There is a proposal for static properties though.

До тех пор, как всегда, вы можете добавить общие свойства к прототипу:

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

и получить доступ к его внутри метода через this.regex.

+0

, но это также связано с объектами экземпляра , чтобы повлиять на весь класс, это будет 'URLParser.regex =/(https?): \/\/([^ \ /] +) \/([^ \?] *) \? ([^ #] *) # (. *) /; '. –

+0

*« это также связано с объектами экземпляра »* Я думаю, но он выполняется только один раз. В конце концов, это зависит от того, как вы хотите получить доступ к значению.' URLParser.regex' vs 'this.regex'. –

+1

на основе этого утверждения _I знать, использовать конструктор для уменьшения инициализации, но влияет на ** экземпляр широкий ** _ Я предполагаю, что он хочет использовать его как статическое свойство 'URLParser.regex' –

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

Там нет тока способа сделать static свойства в JavaScript, однако, вы могли бы просто определить свойство в constructor

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