Entonces lo siguiente funciona:

alert(Number().toString.call(1));

Pero esto no funciona:

alert(Number.toString.call(1));

Además, los siguientes trabajos:

alert(Number.prototype.constructor(1));

Pero esto no funciona:

alert(Number().prototype.constructor(1));

¿Por qué necesitamos los paréntesis después del Número en el primer ejemplo, y por qué debemos omitir los paréntesis en el segundo ejemplo?

1
zjmiller 10 jun. 2011 a las 01:57

4 respuestas

La mejor respuesta

Number es un objeto constructor. Llamado como una función, le permite crear nuevas instancias de números. Number() devuelve el número 0. Las instancias numéricas tienen varias propiedades y métodos, incluidos toString() y toExponential() (por ejemplo). Los siguientes dos bits de sintaxis tienen significados idénticos:

Number().toString.call(1);
(0).toString.call(1);

El objeto Number también tiene propiedades propias. Una propiedad especial es la propiedad prototype. Esto es básicamente una plantilla para nuevas instancias de números. Todas las propiedades que existen en Number.prototype también existen en instancias de números. Entonces podemos agregar un tercer bit de código idéntico a los dos anteriores:

Number.prototype.toString.call(1);

Sin embargo, las instancias numéricas no tienen la propiedad prototype, por lo que no puede acceder a Number().prototype. Por otro lado, tienen una propiedad constructor, que devuelve el objeto que los creó, es decir, el objeto Número. Luego puede acceder a prototype sobre esto. Entonces, nuestro cuarto bit de código idéntico:

Number().constructor.prototype.toString.call(1);

Esperemos que esto haya aclarado la relación entre el objeto Number y las instancias numéricas. Como última nota, todos los bits de código anteriores son idénticos a esto, la forma obviamente correcta de hacer esto:

(1).toString();
2
lonesomeday 9 jun. 2011 a las 22:10

Creo en su ejemplo Number es una clase y Number () es una llamada de constructor que devuelve una instancia de la clase Number.

0
cusimar9 9 jun. 2011 a las 22:01

Aquí hay algunos consejos, pareces muy confundida.

  • La función constructora (Número) no tiene una propiedad llamada toString. Tiene una propiedad llamada prototipo que permite que las instancias vean ese objeto si una propiedad no está definida en el objeto mismo.
  • Number () devuelve una instancia, que tiene una propiedad llamada toString a través de la cadena de prototipo (de Number.prototype.toString). Esas instancias no tienen una propiedad prototipo

// So the following works, you're calling the toString Method of Number.prototype 
// and passing 1 as its context
alert(Number().toString.call(1));


// But this does not work:
// Number (the constructor) does not have property called toString, FAIL
alert(Number.toString.call(1));
0
Juan Mendes 9 jun. 2011 a las 22:21

Puede intentar verificar lo siguiente:

alert(typeof Number());//number
alert(typeof Number);//function

Es normal que tengan comportamientos diferentes, significan cosas diferentes

2
gion_13 9 jun. 2011 a las 22:03