Introducción A JavaScript Orientado A Objetos - JavaScript - MDN
Introducción A JavaScript Orientado A Objetos - JavaScript - MDN
objetos
JavaScript dispone de fuertes capacidades de programacin orientada a objetos, a pesar de que han tenido
lugar algunos debates respecto a sus diferencias de su capacidades en comparacin con otros lenguajes.
Este artculo comienza con una Introduccin a la programacin orientada a objetos, luego examina el modelo
de objetos de JavaScript y, nalmente, muestra los conceptos de programacin orientada a objetos en
JavaScript.
Revisin de JavaScript
Si no te sientes seguro acerca de los conceptos de JavaScript tales como variables, tipos, funciones y el mbito
de aplicacin, puedes leer sobre estos temas en Una nueva introduccin a JavaScript . Tambin puedes
consultar la Gua de JavaScript 1.5.
Terminologa
Clase
Dene las caractersticas del Objeto.
Objeto
Una instancia de una Clase.
Propiedad
Una caracterstica del Objeto, como el color.
Mtodo
Una capacidad del Objeto, como caminar.
Constructor
Es un mtodo llamado en el momento de la creacin de instancias.
Herencia
Una Clase puede heredar caractersticas de otra Clase.
Encapsulamiento
Una Clase slo dene las caractersticas del Objeto, un Mtodo slo dene cmo se ejecuta el Mtodo.
Abstraccin
La conjuncin de herencia compleja, mtodos, propiedades que un objeto debe ser capaz de simular en un
modelo de la realidad.
Polimorsmo
Diferentes Clases podran denir el mismo mtodo o propiedad.
Para una descripcin ms extensa de programacin orientada a objetos, consulta ! Programacin orientada a
objetos en Wikipedia.
Este modelo tambin se conoce como programacin sin clases, orientada a prototipos o basada en ejemplos.
El ejemplo original (y ms cannico) de un lenguaje basado en prototipos es el lenguaje de programacin
autodesarrollado por David Ungar y Randall Smith. Sin embargo, el estilo de programacin sin clases se ha
hecho cada vez ms popular y ha sido adoptado para lenguajes de programacin como JavaScript, Cecil,
NewtonScript, Io, MOO, REBOL, Kevo, Squeak (cuando se utiliza el Viewer framework para manipular los
componentes Morphic) y varios otros. 2
// namespace global
2
3
Nota: Para continuar con las mejores prcticas vamos a utilizar maysculas para los namespace.
// Sub-namespace
2
3
MIAPLICACION.event = {} ;
A continuacin se muestra el cdigo para la creacin de un espacio de nombre y como agregar variables,
funciones y mtodos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Objetos bsicos
JavaScript tiene varios objetos incluidos en su ncleo, como Math, Object, Array y String. El siguiente ejemplo
muestra cmo utilizar el objeto Math para obtener un nmero al azar mediante el uso de su mtodo
random().
Nota: este y todos los dems ejemplos suponen que una funcin llamada alert (como el que se incluye en
los navegadores web) se dene de forma global. La funcin alert no es realmente parte de JavaScript.
Consulta Core JavaScript 1.5 Reference:Global Objects para obtener una lista de los objetos bsicos en
JavaScript.
Cada objeto en JavaScript es una instancia del objeto Object, por lo tanto, hereda todas sus propiedades y
mtodos.
Objetos personalizados
La clase
JavaScript es un lenguaje basado en prototipos que no contiene ninguna declaracin de clase, como se
encuentra, por ejemplo, en C + + o Java. Esto es a veces confuso para los programadores acostumbrados a los
lenguajes con una declaracin de clase. En su lugar, JavaScript utiliza funciones como clases. Denir una clase
es tan fcil como denir una funcin. En el ejemplo siguiente se dene una nueva clase llamada Persona.
function Persona() { }
1
2
function
Persona()
{
}
3
4
5
Por favor, consulta tambin Object.create para ver un mtodo nuevo y alternativo de creacin de ejemplos.
El constructor
El constructor es llamado en el momento de la creacin de la instancia (el momento en que se crea la
instancia del objeto). El constructor es un mtodo de la clase. En JavaScript, la funcin sirve como el
constructor del objeto, por lo tanto, no hay necesidad de denir explcitamente un mtodo constructor. Cada
accin declarada en la clase es ejecutada en el momento de la creacin de la instancia.
El constructor se usa para establecer las propiedades del objeto o para llamar a los mtodos para preparar el
objeto para su uso. Ms adelante describiremos como agregar mtodos a clase y sus deniciones ya que se
realiza utilizando una sintaxis diferente.
En el siguiente ejemplo, el constructor de la clase Persona muestra un alerta que dice (Una instancia de
persona) cuando se crea la instancia de la clase Persona.
1
2
3
function
Persona()
{
alert('Una
instancia
de
Persona');
}
4
5
6
1
2
3
4
function
Persona(primerNombre)
{
this.primerNombre
=
primerNombre;
alert('Una
instancia
de
Persona');
}
5
6
7
8
9
10
11
Los mtodos
Los mtodos siguen la misma lgica que las propiedades, la diferencia es que son funciones y se denen
como funciones. Llamar a un mtodo es similar a acceder a una propiedad, pero se agrega () al nal del
nombre del mtodo, posiblemente con argumentos.
En el siguiente ejemplo se dene y utiliza el mtodo diHola() para la clase Persona.
1
2
3
function
Persona(primerNombre)
{
this.primerNombre
=
primerNombre;
}
4
5
6
7
Persona.prototype.diHola
=
function()
{
alert
('Hola,
Soy
'
+
this.primerNombre);
};
8
9
10
11
12
13
14
En JavaScript los mtodos son objetos como lo es una funcin normal y se vinculan a un objeto como lo hace
una propiedad, lo que signica que se pueden invocar desde "fuera de su contexto". Considera el siguiente
cdigo de ejemplo:
1
2
3
function
Persona(primerNombre)
{
this.primerNombre
=
primerNombre;
}
4
5
6
7
Persona.prototype.diHola
=
function()
{
alert
("Hola,
Soy
"
+
this.primerNombre);
};
8
9
10
11
12
13
14
15
16
17
18
19
20
En el ejemplo se muestran todas las referencias que tenemos de la funcin diHola una de ellas
es persona1, otra en Persona.prototype, en la variable funcionSaludar, etc. todas se reeren a la misma
funcin. El valor durante una llamada a la funcin depende de como realizamos esa llamada. En el comn de
los casos cuando la llamamos desde una expresin donde tenemos a la funcin desde la propiedad del objeto
persona1.diHola(). Se establece en el objeto que tenemos en la funcin (persona1), razn por la cual
persona1.diHola() utiliza el nombre "Alicia" y persona2.diHola() utiliza el nombre "Sebastian". Pero si
realizamos la llamada de otra manera, se establecer de otra manera: Llamandola desde una variable
funcionSaludar() Este establece al objeto global (windows, en los navegadores). Desde este objeto
(probablemente) no tiene a la propiedad primerNombre, que nalizar con "Hola, Soy indenido". (El cual se
incluye en modo de cdigo suelto, sino sera diferente [un error] en modo estricto, pero para evitar
confusiones ahora no vamos a entra en detalles.) O podemos establecerla de forma explicita utilizando
Function.call ( Function.apply), como se muestra al nal del ejemplo funcionSaludar.call(persona1).
Herencia
La herencia es una manera de crear una clase como una versin especializada de una o ms clases (JavaScript
slo permite herencia simple). La clase especializada comnmente se llama hija o secundaria, y la otra clase se
le llama padre o primaria. En JavaScript la herencia se logra mediante la asignacin de una instancia de la clase
primaria a la clase secundaria, y luego se hace la especializacin.
JavaScript no detecta la clase hija prototype.constructor, vea las propiedades del Core JavaScript 1.5
Reference:Global Objects:Object:prototype, as que debemos decrselo de forma manual.
En el siguiente ejemplo denimos la clase Estudiante como una clase secundaria de Persona . Luego
redenimos el mtodo diHola() y agregamos el mtodo diAdios().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//
Ejemplos
de
uso
var
estudiante1
=
new
Estudiante("Carolina",
"Fsica
Aplicada");
estudiante1.diHola();
//
muestra
"Hola,
Soy
Carolina.
Yo
estoy
estudianto
Fsica
Aplic
estudiante1.caminar();
//
muestra
"Yo
estoy
caminando
!"
estudiante1.diAdios();
//
muestra
"
Adios
!"
50
51
52
1
2
3
4
5
function
crearObjeto(proto)
{
function
ctor()
{
}
ctor.prototype
=
proto;
return
new
ctor();
}
6
7
8
//
uso:
Estudiante.prototype
=
crearObjeto(Persona.prototype);
Ver Object.create para conocer ms sobre lo que hace, y complementar con los motores antiguos.
Encapsulacin
En el ejemplo anterior, Student no tiene que saber cmo se aplica el mtodo walk() de la clase Person, pero,
sin embargo, puede utilizar ese mtodo. La clase Student no tiene que denir explcitamente ese mtodo, a
menos que queramos cambiarlo. Esto se denomina la encapsulacin, por medio de la cual cada clase hereda
los mtodos de su elemento primario y slo tiene que denir las cosas que desea cambiar.
Abstraccin
Un mecanismo que permite modelar la parte actual del problema de trabajo. Esto se puede lograr por
herencia (especializacin) o por composicin. JavaScript logra la especializacin por herencia y por
composicin al permitir que las instancias de clases sean los valores de los atributos de otros objetos.
La clase Function de JavaScript hereda de la clase de Object (esto demuestra la especializacin del modelo) y la
propiedad Function.prototype es un ejemplo de Objeto (esto demuestra la composicin)
1
2
3
Polimorsmo
Al igual que todos los mtodos y propiedades estn denidas dentro de la propiedad prototipo, las diferentes
clases pueden denir mtodos con el mismo nombre. Los mtodos estn en el mbito de la clase en que
estn denidos. Esto slo es verdadero cuando las dos clases no tienen una relacin primario-secundario
(cuando uno no hereda del otro en una cadena de herencia).
Notas
Las tcnicas presentadas en este artculo para aplicar la programacin orientada a objetos no son las nicas
que se pueden utilizar en JavaScript, que es muy exible en trminos de cmo se puede realizar la
programacin orientada a objetos.
Del mismo modo, las tcnicas presentadas aqu no utilizan ninguna modicacin o hack de lenguaje ni imitan
las implementaciones de teoras de objetos de otros lenguajes.
Hay otras tcnicas que hacen incluso programacin orientado a objetos ms avanzada en JavaScript, pero que
estn fuera del alcance de este artculo introductorio.
Referencias
1. Mozilla. "Core JavaScript 1.5 Guide", http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide.
2. Wikipedia. "Programacin orientada a objetos", ! http://es.wikipedia.org/wiki/Program...tada_a_objetos.
3.