Tengo la siguiente clase de juguete para encapsular algunas funciones bit a bit:
class BitOp { static set(num) { return num; } static shiftR(num, n=1) { return num >> n; } static shiftL(num, n=1) { return num << n; } static toBin(num) { console.log(num, '>', num.toString(2)); return num; } } const set = BitOp.set, shiftR = BitOp.shiftR, shiftL = BitOp.shiftL, toBin = BitOp.toBin; toBin(shiftL(set(44), 2));Me gustaría ver si puedo usar la función anterior y quizás agregar un envoltorio alrededor de una variable que la llame para que pueda usarse alternativamente para encadenar llamadas a métodos, como:
new BitOp().set(44).shiftL(2).toBin(); // or new BitOp(44).shiftL...Sé que puedo escribir una clase separada para él, como la siguiente, ¡pero me gustaría usar un enfoque más compacto e interesante!
class BitOp { set(num) { this.num = num; return this; } shiftR(n=1) { this.num >>= n; return this; } shiftL(n=1) { this.num <<= n; return this; } toBin() { console.log(this.num, '>', this.num.toString(2)); return this; } } new BitOp().set(44).shiftL(2).toBin();Parece que estás preguntando cómo instanciar una nueva clase invocando una función:
class BitOp { constructor (num) { this.num = num; } set (num) { this.num = num; return this; } shiftR (n=1) { this.num >>= n; return this; } shiftL (n=1) { this.num <<= n; return this; } toBin () { console.log(this.num, '>', this.num.toString(2)); return this; } } function bitOp (num) { return new BitOp(num); } bitOp(5).toBin(); // logs 5 > 101Inspirándose en la respuesta aceptada en Posible hacer un método factorial encadenado sin un método auxiliar , aquí hay un enfoque que permitiría ambos:
const shiftR = (num, places) => num >> (places || 1); const shiftL = (num, places) => num << (places || 1); const BitOp = (num) => new InlineBitOp(num); class InlineBitOp { constructor(num) { this.num = num } shiftL(places) { return BitOp(shiftL(this.num, places)) } shiftR(places) { return BitOp(shiftR(this.num, places)) } toString() { return this.num }; } let x = 44; console.log(shiftL(shiftL(x, 2), 3)); console.log('' + new InlineBitOp(x).shiftL(2).shiftL(3));