Mam prostą klasę z jedną metodą exec(arg1,..,argn)
i chcę mieć wiele metod aliasowych, które wywołują exec
z predefiniowanymi wartościami argumentów (np. exec_sync = exec.bind(this, true)
).Właściwy sposób dynamicznego dodawania funkcji do klas ES6
Poniższa załatwia sprawę:
class Executor {
constructor() {
this.exec_sync = this.exec.bind(this, true);
}
exec(sync, cmd, args/* ... */) {
// impl
}
}
Ale ja nie wiem, czy to jest dobry pomysł, czy to jest idiomatyczne do ES6.
UDATE:
W rzeczywistych przykładem dwie zagnieżdżone pętle z odpowiednio 3 i 4, pętle, które są stosowane w celu dynamicznego dodać całkowitą liczbę 12 alias metod do klasy. Uciążliwym zadaniem byłoby jawne zdefiniowanie metod aliasów, gdy faktycznie można skorzystać z JS, który jest językiem programowania opartym na prototypach.
UPDATE 2 - PRZYKŁAD:
Załóżmy, że mamy mieć prosty klient HTTP z metody request(method, body)
i chcemy zapewnić metody alias GET
, PUT
itp Byłoby to wyglądać mniej więcej tak:
class HTTP {
constructor() {
['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
this[method] = this.request.bind(this, method);
}, this);
}
request(method, body) {
// execute the HTTP request
}
}
Dlaczego nie tworzyć jawnie wielu funkcji? 'exec_sync (... args) {return this.exec (true, ... args); } ' – zerkms
@zerkms Myślę, że byłoby bardziej jasne, co robi klasa. Po prostu interesowała mnie możliwość zrobienia czegoś takiego. –
Klasy ES6 to po prostu cukier syntaktyczny. Nic nie zmieniło się pod względem dodawania właściwości do obiektu w środowisku wykonawczym. –