En javascript, la tarea de crear objetos se deja al programador el cuál escogerá la mejor estrategia según sus intereses.
Javascript no es Java en el sentido de que es un leguaje basado en objetos donde estos son la entidad fundamental. Difiere de Java en que tiene su propia filosofía acerca de la creación y uso de objetos.
Estas diferencias pueden causar problemas a los programadores que vienen de otros lenguajes y se pierden al intentar aplicar la misma filosofía que Java, o C++ a Javascript. En este sentido, la filosofía de JS se parece más a SmallTalk.
Características de javascript
Javascript no tiene ni clases ni tipos. En JS todo es un objeto (con las excepciones de null
y undefined
).
Un objeto JS es un contenedor que puede contener una colección de otros objetos.
Primera forma de crear un objeto
El punto de partida es el objeto vacío {}
. {}
significa que es un objeto y puede contener otros objetos.
Dentro de un objeto se pueden definir los miembros como nombre:objeto separados por una coma. Los nombres se conocen generalmente como las propiedades del objeto.
Por ejemplo:
{
prop1: object1,
prop2: object2,
prop3: {}
};
Nótese que prop3
es el objeto vacío.
Segunda forma de crear un objeto
new Object();
tiene el mismo efecto (casi) que {}
, i.e. crea un objeto vacío.
Acceso a las propiedades
Tenemos dos métodos equivalentes para el acceso a las propiedades de un objeto:
object.property;
o
object[property];
La ventaja del segundo es que la propiedad puede ser un String y por lo tanto ser determinada dinámicamente. Por otra parte, la primera versión es más rápida por que se determina en tiempo de compilación.
También podemos formar cadenas de propiedades como
object.property1.property2;
o
object[property1][property2];
Asignar el valor de una propiedad o crear una nueva propiedad
object.property1={}; // asignar
object.property3={}; // crear y asignar una nueva propiedad
Todos los objetos javascript son dinámicos y por lo tanto podemos crear nuevas propiedades en cualquier momento.
La variable de objeto global
Para poder usar las variables tenemos que tener un método para seguirles la pista una vez creadas. Pero en Javascript la idea de variable es un tanto sutil.
JavaScript proporciona un objeto estándar llamado global object
En general, este objeto global es llamado this, aunque si estamos ejecutando en un navegador es llamado window.
Atención: this se refiere al objeto global siempre que esté fuera de una función.
Podemos crear propiedades de alcance (scope) global sencillamente dando propiedades a this fuera de una función:
this.myObject={};
Diferentes formas de crear variables globales
myObject={};
var myObject; myObject={};
var myObject={};
Todas ellas se traducen en this.myObject={};
En Javascript no existen las variables globales, sólo propiedades del objeto global.
Recodar que this dentro de una función tiene un significado distinto.
Hoisting
Para hacer las cosas un poco más interesantes, hay una sutil diferencia entre:
this.property=value;
y var property=value;
La segunda versión en realidad hace que podamos usar property antes de ser declarada. La forma en que JS hace esto es muy sencilla:
- Escanea todo el código en busca de declaraciones
var
. - Lleva automáticamente la declaración al principio del código con lo que todas las variables dentro del contexto quedan declaradas y por tanto podemos usarlas en cualquier punto del programa.
- Cuando la ejecución llega a la línea
var property=value;
le asigna el valor.
Semántica de las referencias a objetos
var myObject1={};
var myObject2=myObject1;
Tanto myObject1
como myObject2
referencian exactamente al mismo objeto. Un cambio en uno será visible en el otro.
Objetos que vienen con el lenguaje
Hay una serie de objetos que ya vienen con Javascript, uno de ellos es el objeto String.
new String("Hola que tal");
Crea un nuevo objeto cada vez que es llamado. Por ejemplo, podríamos tener un objeto tal como:
var myAddress={
Name: new String("Pere");
Address: new String("Eivissa");
};
console.log(myAddress.Name);
console.log(myAddress['Address']);
El objeto String es tan importante que podemos abreviar su creación llamando sencillamente a alert('hola');
en vez de alert(new String('hola'));
Pero en realidad Javascript está usando la segunda versión en todo caso.
El objeto Number
Podemos usar tanto
var num= new Number(3);
como
var num=3;
Lo que ocurre es que la segunda versión está ligeramente optimizada (sería un tipo primitivo en otros lenguajes) pero en el mismo momento en que hacemos esto
num.toString();
Se convierte automáticamente al objeto Number.
No se pueden añadir propiedades a un objeto primitivo.
En cambio, podemos añadir nuevas propiedades al objeto Number sin mayor problema.
Number.prototype.porDos=function() {
return this*2;
};
var num=new Number(3);
console.log(num.porDos()); // 6
Expresiones e inmutabilidad
Una expresión toma datos y los combina para producir nuevos datos.
var res=2*3+4; // res=10
pero
var n1= new Number(2);
var n2= new Number(3);
n2.age=13;
var n3=n1+n2;
console.log(n3); // 5
console.log(n3.age); // undefined
Esto ocurre porque las expresiones que combinan objetos siempre devuelven un nuevo objeto del tipo original (Number).
Disclaimer
Esta entrada es resultado de apuntes tomados al vuelo leyendo la serie de artículos de javascript escrita por Ian Elliot en i-programmer. No pretende ser una traducción al español ni nada parecido, es un simple registro para mi uso personal. Debe referirse al original para su lectura.
Fuente: i-programmer.info
Written with StackEdit.