es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.
Tags:  , , ,

Answer

  1. Avatar for 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:

    class MyNumber extends Number {
      constructor(value) {
        super(value);
        Object.defineProperty(this, 'value', {
          value: value,
          enumerable: false,
          writable: false
        });
      }
    
      // define custom methods or properties here
    }
    

    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.

Comments are closed.