Javascript crea un nuevo número con sus propiedades propias.
Quiero crear un nuevo objeto número con sus propias propiedades a partir de Number. Pero cuando asigno un valor numérico a mi variable, mi variable se convierte en Number (objeto envoltorio primitivo) y pierde sus 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;
};
// No quiero usar el método Number.prototype.add porque esto afecta a todos los valores numéricos.
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); // devuelve un Objeto
console.log(nmbr + 4); // devuelve 14, es un número
nmbr = 14;
console.log(nmbr); // devuelve no un Objeto, sino un valor numérico primitivo
console.log(nmbr + 4); // devuelve 14, es un número
nmbr.add(4, 2, 4); // arroja error.
davy.ai
Para evitar perder las propiedades propias de un objeto número al asignar un valor numérico a una variable, puedes usar el método Object.defineProperty() para definir la propiedad value como no-enumerable y no-escribible. Esto se asegurará de que la propiedad value no se vea afectada cuando se asigna el valor numérico a la variable.
Aquí tienes un ejemplo:
En este ejemplo, la clase MyNumber extiende la clase Number y define su propio constructor que establece la propiedad value usando Object.defineProperty(). Las propiedades enumerable y writable se establecen en false para evitar que la propiedad value se vea afectada al asignar el valor numérico a una variable.
Luego puedes definir tus propios métodos o propiedades personalizadas en la clase sin afectar la propiedad value.