El título de este post parece un poco extraño pero me gustaría aclarar el por qué: Normalmente estamos acostumbrados a llamar JSON a lo que en realidad es Javascript Object Literal. No es algo que nos suponga un cambio en nuestro código pero creo que es interesante saber la diferencia.
¿Por qué no es JSON?
Cuando hablamos de JSON deberíamos referimos a Javascript Object Notation, el cual es un formato para el intercambio de datos. Como muchos ya conocéis, es una forma muy simple de trabajar con datos en cliente que poco a poco está ganando terreno al formato XML. Lo que obtenemos es una estructura como la del siguiente ejemplo:
var pc = {
"motherboard": "GIGABYTE GA-A75-D3H",
"processor": "AMD A8-3870",
"memory": "Corsair 16GB PC3-15000",
"graphic": "ATI ATI FirePro 2460",
"sound": "Creative Recon3D Fatal1ty Champion",
"hd": "ADATA 120GB S510",
"so": "Windows 8 Release Preview"
};
Otra fuente de datos clara que utiliza JSON, además de XML, sería en la recuperación del timeline público de Twitter.
Si nos fijamos, el nombre de las propiedades sólo pueden ser strings y como valores podemos tener strings, números, arrays, booleans o null, pero no funciones o cualquier otro tipo de objeto. Es por ello que no podemos pasar directamente una fecha a través de new Date() o una función para ejecutarla posteriormente.
JavaScript Object Literal
Object Literal es lo que en el mundo del desarrollo erróneamente se nombra como JSON. Lo que se pretende con ello es encapsular un conjunto de propiedades, funciones, etcétera dentro de un mismo bloque, obteniendo así un scope más limitado y simulando de esta forma la programación orientada a objetos. Lo que difiere de JSON, además de la declaración de funciones dentro de nuestro objeto, es que cada propiedad puede tener como nombre un identificador, un string o un número (vimos en la explicación anterior que sólo podían ser strings para el caso de JSON). Si modificamos el objeto pc anterior, obtendríamos lo siguiente:
var pc = {
motherboard: "GIGABYTE GA-A75-D3H",
processor: "AMD A8-3870",
memory: "Corsair 16GB PC3-15000",
graphic: "ATI ATI FirePro 2460",
sound: "Creative Recon3D Fatal1ty Champion",
hd: "ADATA 120GB S510",
so: "Windows 8 Release Preview",
8: "Number test",
"literal": "string property name",
init: function() {
//Init stuff
},
addComponent: function(componentType, desc) {
//Add a new component
},
deleteComponent: function(componentType) {
//Delete a component
}
};
¿Cambia algo en nuestro día a día? En realidad, sólo nos permitirá hablar más apropiadamente en cada situación 😀
¡Saludos!