Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

139
Views
Agregar atributo a la instancia de "Número"

Quiero ver si un número es un múltiplo de π . Entonces, idealmente, se comportaría exactamente como un número ordinario, pero con una funcionalidad adicional:

 >>> pi 3.14... >>> pi.isMultipleOfPi true >>> b = pi * 5 >>> b.isMultipleOfPi true

con ilusiones

 >>> c = pi + 1 >>> c.isMultipleOfPi false >>> d = pi + 2 * pi >>> d.isMultipleOfPi true

¿Hay alguna manera de lograr algo así en Javascript? Creo que esto sería bastante sencillo en Python, pero parece que no hay forma de crear sobrecargas para sumas/multiplicaciones, etc. en JS. Si lo hubiera, simplemente podría extender la clase Number .

Establecer algo en Number.prototype = function tampoco parece funcionar, ya que lo establece para toda la clase y no en una instancia.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

No puede agregar propiedades a valores numéricos específicos ; no son objetos y por lo tanto no pueden tener ninguna propiedad. Puede agregar propiedades al prototipo de Número, de la siguiente manera:

 Object.defineProperty(Number.prototype, "isMultipleOfPi", { get: function() { return this.valueOf() % Math.PI === 0; } }); const pix2 = Math.PI * 2; console.log(pix2.isMultipleOfPi); console.log((7).isMultipleOfPi);

Eso agrega una propiedad de prototipo de Número definida con una función "obtener" para que el código que publicó funcione como espera. El método estará disponible para todos los números en su programa, lo que no parece malo si desea esa función.

Tenga en cuenta también que muchas personas desaprueban la extensión de objetos prototipo integrados. En mi ejemplo, amplié el prototipo de una manera que mejora algunos de los problemas con los prototipos extendidos.

about 4 years ago · Juan Pablo Isaza Report

0

Al principio pensé que quería hacer esto para todos los números, que se responde aquí .

Pero si solo desea hacer esto para un número específico, puede hacerlo, pero probablemente no quiera hacerlo. El 99.9999999999998% de todos los números con los que trabaja en JavaScript son primitivos, no objetos, por lo que no tienen ninguna propiedad (las que parecen tener solo provienen de Number.prototype [o, a su vez, de Object.primitive ], que utilizará el motor de JavaScript si intenta acceder a una propiedad en un número primitivo).

En su lugar, podría crear un objeto numérico y ponerle la propiedad:

 const c = new Number(Math.PI); c.isMultipleOfPI = true; console.log(c); console.log(String(c)); console.log(c.isMultipleOfPI);

Sin embargo, el problema con eso se demuestra en console.log(c); línea de arriba. Con las herramientas de desarrollo de Chrome (y quizás otras), verás esto:

 { isMultipleOfPI: true, }

en lugar de 3.141592653589793 como podría estar esperando.

La razón es que c es un objeto , no una primitiva, y algunas cosas que lo usan (como console.log ) pueden tratarlo principalmente como un objeto en lugar de como un número.

Sin embargo, las matemáticas y la concatenación de cadenas funcionan:

 const c = new Number(Math.PI); c.isMultipleOfPI = true; console.log(c * 2); console.log(c - 2); console.log(c + 2); console.log(c / 2); console.log("The number is " + c);

Solo tenga en cuenta que las instancias de Number (objetos) son objetos, y que muy, muy poco código está escrito explícitamente para trabajar con ellos correctamente. La mayoría del código que usa números espera números primitivos .

Alternativamente, puede crear una propiedad de acceso en Number.prototype ( Pointy le muestra cómo ) que determina si el número al que se llama es un múltiplo de PI y devuelve la bandera correcta. Eso le daría la sintaxis que mostró, pero en todos los números. Pero es una llamada de función, por lo que acceder a la propiedad funciona cada vez. Simplemente tener una isMultipleOfPI(num) podría ser más claro.

En un comentario que has escrito:

Porque Number.prototype = function(){ return self % Math.PI ~ 0 } no es lo que estoy buscando. Me gustaría distinguir entre 3.14 y 3.14 con la propiedad isMultipleOfPi.

La única forma de hacerlo es usar objetos Number en lugar de números primitivos, como se describe anteriormente.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!