Quiero crear un nuevo objeto numérico con propiedades propias de Número. Pero cuando asigno un valor numérico a mi variable, mi variable se convierte en Número (objeto contenedor primitivo) y pierde propiedades propias. ¿Cómo puedo evitar esto? Ejemplo
class Fnumber extends Number { value = 0; [Symbol.toPrimitive](hint) { if (hint === 'object') { return this; } return this.value; }; //I don't want use Number.prototype.add method because this effect all Number values. add = function(...v) { this.value += Array.prototype.slice.call(arguments).reduce((o, v) => o + v) } } var nmbr = new Fnumber(); nmbr.add(4, 2, 4); console.log(nmbr); //return a Object console.log(nmbr + 4); //return 14 is number nmbr = 14; console.log(nmbr); //return not a Object its Primative number value console.log(nmbr + 4); //return 14 a number nmbr.add(4, 2, 4); //raise error.Al hacer nmbr = 14 , asigna 14 a nmbr , no está cambiando el nmbr.value , está sobrescribiendo el objeto. En su lugar, llame a add y use nmbr.value cuando sea necesario.
class Fnumber extends Number { value = 0; add(...v) { this.value += Array.prototype.slice.call(arguments).reduce((o, v) => o + v) } } var nmbr = new Fnumber(); nmbr.add(4, 2, 4); console.log(nmbr.value); nmbr.add(5); console.log(nmbr.value); nmbr.value = 25; // assign a value to nmbr.value console.log(nmbr.value); Si no planea reasignar el objeto, una buena práctica es usar const en lugar de var , vea el error a continuación.
class Fnumber extends Number {}; const nmbr = new Fnumber(); nmbr = 14;Encontré la solución indirectamente.
class Fnumber extends Number { value = 0; add(...v) { this.value += Array.prototype.slice.call(arguments).reduce((o, v) => o + v) } } //temğrary variable description var _nmbr=new Fnumber(); //Define nmbr variable in global scobe Object.defineProperty(window,"nmbr",{ enumerable: true, configurable: true, get() { return _nmbr; }, set(val) { if (typeof val=="number")_nmbr.value=val; } }); nmbr=4; console.log(nmbr+2);//output 6 //still nmbr variable is object,because assigned value to _nmbr.value with above set method nmbr.add(4, 2, 4); console.log(nmbr+2);//output 16