El segundo ejemplo simplemente define una instancia de Object
, con algunas propiedades establecidas. El primero es mucho más interesante.
Las funciones en JavaScript tienen dos propósitos, uno como una función/procedimiento normal, y el otro como la base para la herencia del prototipo, similar a una "clase" en el OOP normal.
Por ejemplo:
var apple = function() {
this.type = 'granny smith';
};
var myApple = new apple();
alert(myApple.type); // -> 'granny smith'
Aquí, hemos definido una "clase" llamada apple
, con un inicializador que establece la propiedad type
. myApple
se crea como una instancia de apple
, y la propiedad type
se establece mediante el inicializador apple()
.
(Dicho sea de paso, new apple()
podría también ser llamado como new apple
con el paréntesis omitido y el resultado sigue siendo el mismo, el inicializador todavía se llama, sólo se recibe ningún argumento)
La otra cosa importante que usando new
nos da es herencia prototípica. Todas las funciones vienen con un objeto prototipo en el que podemos establecer propiedades. Esas propiedades se convierten en valores de reserva, por ejemplo, objetos que no tienen su propio valor definido.
Ejemplo:
var greenApple = function() { };
var myApple = new apple();
alert(myApple.color); // -> undefined
greenApple.prototype.color = 'green'
alert(myApple.color); // -> green
Aquí, el establecimiento de greenApple.prototype.color
afectó a la propiedad de color para el myApple
ya habíamos creado. Esto es lo que se conoce como herencia prototípica, y tiene una amplia variedad de usos.
Editar:que sigue se refiere a una versión anterior de la cuestión que se ha modificado mientras estaba escribiendo esto. Puede ignorarlo a menos que esté especialmente interesado.
Ahora, de vuelta a su primer ejemplo:
var apple = new function() { ... }
Debido a que tiene la palabra clave new
antes de la definición de la función, el efecto es como crear la clase de manzana, por lo que un objeto myApple, luego tirar la clase de manzana lejos. Si tiene acceso a esta clase, puede usar .prototype
para agregar propiedades de prototipo, pero no lo hace; todo lo que está contenido en la variable apple
(en términos de OOP) es una instancia de la clase, no la clase misma.
No, no es la sintaxis JSON, es un objeto literal. JSON es un formato de texto que es un subconjunto de la sintaxis literal del objeto JavaScript. – Guffa
json tampoco admite funciones –