Rolf B: Replikation von Method Chaining außerhalb von Objekten?

Beitrag lesen

Hallo Christian,

nee, geht nicht, weil Funktionen ihre Daten über Parameter bekommen.

Methoden bekommen implizit einen weiteren Parameter, nämlich this, und das wird beim Method-Chaining ausgenutzt.

Hm. Sorry. Ich hab gelogen. Natürlich geht es. Aber es ist bäh. Die Lösung müllt den Number-Prototypen zu. Möglicherweise ist dein realer Kontext ein anderer und Du kannst die Idee dennoch nutzen:

Number.prototype.timesTwo = function() { return this * 2; }
Number.prototype.addOne = function() { return this + 1; }
Number.prototype.minusSeven = function() { return this - 7; }

console.log((1).addOne().timesTwo().minusSeven());   // gibt -3 aus

Die Magie liegt darin, dass Zahlen in JS zwar keine Objekt sind, sondern einfache Werte, aber in ein Number-Objekt verpackt werden, wenn man Methoden auf ihnen aufrufen will. Das nennt man boxing (und unboxing für den Rückweg), und es ermöglicht die Definition von Methoden für Zahlen.

Weil 1.addOne() mehrdeutig ist (Dezimalpunkt oder Method-Call Operator), muss die 1 geklammert werden.

Außer dem Vermüllen von Number.prototype ist ein weiteres Problem an dem Code, dass vier Boxing-Operationen nötig sind, und ebensoviele Unboxing-Operationen, um die Beispielzeile auszuführen. Das ist nicht effizient. Aber - es geht.

Fun fact: Chrome definiert auf Number.prototype Delegatoren für etliche Methoden von Math. Firefox nicht...

let x = 4;
console.log(x.sqrt());   // 4
console.log(x.max(7));   // 7

Rolf

--
sumpsi - posui - obstruxi