JavaScript The Good Parts
JavaScript The Good Parts
JavaScript The Good Parts
Rara vez es posible que los comits de normalizacin eliminen las imperfecciones de un idioma
porque hacerlo podra causar la ruptura de todos los malos programas que dependen de esas
partes malas. Por lo general son impotentes para hacer cualquier cosa, excepto ms
caractersticas en la parte superior de la pila de imperfecciones existentes. Y las nuevas
caractersticas no siempre interactan armoniosamente, produciendo as ms partes malas.
Pero usted tiene el poder de definir su propio subconjunto. Usted puede escribir mejores
programas confiando exclusivamente en las partes buenas.
Este libro no intentar describir completamente el idioma. En su lugar, se centrar en las partes
buenas con advertencias ocasionales para evitar lo malo. El subconjunto que se describir aqu se
puede utilizar para construir programas confiables y legibles, pequeos y grandes. Al centrarnos
slo en las partes buenas, podemos reducir el tiempo de aprendizaje, aumentar la robustez y
ahorrar algunos rboles.
Tal vez el mayor beneficio de estudiar las partes buenas es que se puede evitar la necesidad de
desaprender las partes malas. Desaprender malos patrones es muy difcil. Es una tarea dolorosa
que la mayora de nosotros enfrentamos con extrema renuencia. A veces, los idiomas estn
subdivididos para que funcionen mejor para los estudiantes. Pero en este caso, estoy
subdividiendo JavaScript para que funcione mejor para los profesionales.
Por qu JavaScript?
JavaScript es un idioma importante porque es el idioma del navegador web. Su asociacin con el
navegador lo convierte en uno de los lenguajes de programacin ms populares del mundo. Al
mismo tiempo, es uno de los lenguajes de programacin ms despreciados del mundo. El API del
navegador, el DOM (Document Object Model) es bastante terrible, y JavaScript es injustamente
culpado. Con DOM sera doloroso trabajar con l en cualquier lengua. El DOM est mal
especificado e implementado de manera inconsistente. Este libro slo toca muy ligeramente en los
DOM. Creo que escribir un buen libro de piezas sobre el DOM sera muy difcil.
JavaScript es ms despreciado porque no es algn otro idioma. Si eres bueno en algn otro idioma
y tienes que programar en un entorno que slo es compatible con JavaScript, entonces ests
obligado a usar JavaScript, y eso es molesto. La mayora de las personas en esa situacin ni
siquiera se molestan en aprender JavaScript primero, y luego se sorprenden cuando JavaScript
resulta tener diferencias significativas con el otro idioma que preferiran usar, y que esas
diferencias importan.
La cosa asombrosa sobre el Javascript es que es posible conseguir el trabajo hecho con l sin
saber mucho sobre el lenguaje, o incluso saber mucho sobre la programacin. Es un lenguaje con
enorme poder expresivo. Es an mejor cuando sabes lo que ests haciendo. La programacin es
un negocio difcil. Nunca debe emprenderse en la ignorancia.
Analizando JavaScript
JavaScript se basa en algunas muy buenas ideas y algunas muy malas.
Las ideas muy buenas incluyen funciones, mecanografa suelta, objetos dinmicos, y una notacin
expresiva del objeto literal. Las malas ideas incluyen un modelo de programacin basado en
variables globales.
Las funciones de JavaScript son objetos de primera clase con (principalmente) el mbito lxico.
JavaScript es el primer lenguaje lambda que va a la corriente principal. En el fondo, JavaScript
tiene ms en comn con Lisp y Scheme que con Java. Es Lisp en la ropa de C. Esto hace que
JavaScript sea un lenguaje notablemente potente.
JavaScript tiene una notacin literal muy potente. Los objetos se pueden crear simplemente
enumerando sus componentes. Esta notacin fue la inspiracin para JSON, el popular formato de
intercambio de datos. (Habr ms informacin sobre JSON en el Apndice E.)
JavaScript es muy difamado por su eleccin de ideas clave. En su mayor parte, sin embargo, esas
opciones eran buenas, si fuera inusual. Pero haba una opcin que era particularmente mala:
JavaScript depende de las variables globales para la vinculacin. Todas las variables de nivel
superior de todas las unidades de compilacin se lanzan juntas en un espacio de nombres comn
denominado objeto global. Esto es malo porque las variables globales son malas, y en JavaScript
son fundamentales. Afortunadamente, como veremos, JavaScript tambin nos da las herramientas
para mitigar este problema.
En algunos casos, no podemos ignorar las partes malas. Hay algunas partes inevitables horribles,
que sern llamados a medida que ocurren. Tambin se resumirn en el Apndice A. Pero
tendremos xito en evitar la mayora de las partes malas de este libro, resumiendo gran parte de
lo que qued fuera en el Apndice B. Si quieres saber ms sobre las partes malas y cmo usarlas
Mal, consulte cualquier otro libro JavaScript.
El estndar que define JavaScript (aka JScript) es la tercera edicin de The ECMAScript
Programming Language, que est disponible en
http://www.ecmainternational.org/publications/files/ecma-st/ECMA-262.pdf. El lenguaje descrito en
este libro es un subconjunto adecuado de ECMAScript. Este libro no describe el idioma entero
porque deja fuera las partes malas. El tratamiento aqu no es exhaustivo. Evita los casos de borde.
T tambin deberas. Hay peligro y miseria en los bordes.
JavaScript es un lenguaje de muchos contrastes. Contiene muchos errores y bordes afilados, por lo
que podra preguntarse: "Por qu debo usar JavaScript?" Hay dos respuestas. La primera es que
no tienes eleccin. La Web se ha convertido en una plataforma importante para el desarrollo de
aplicaciones, y JavaScript es el nico idioma que se encuentra en todos los navegadores. Es
lamentable que Java fall en ese entorno; Si no lo hubiera hecho, podra haber una opcin para las
personas que desean un lenguaje clsico fuertemente mecanografiado. Pero Java fall y JavaScript
est floreciendo, por lo que hay evidencia de que JavaScript hizo algo bien.
La otra respuesta es que, a pesar de sus deficiencias, JavaScript es realmente bueno. Es ligero y
expresivo. Y una vez que te quedes al tanto, la programacin funcional es muy divertida.
Pero para usar bien el lenguaje, debes estar bien informado sobre sus limitaciones. Voy a golpear a
los que con cierta brutalidad. No dejes que eso te desanime. Las partes buenas son lo
suficientemente buenas para compensar las partes malas.
<html><body><pre><script src="program.js">
</script></pre></body></html>
document.writeln('Hello, world!');
A continuacin, abra su archivo HTML en su navegador para ver el resultado. A lo largo del libro, se
utiliza un mtodo de mtodo para definir nuevos mtodos. Esta es su definicin:
Se explicar en el captulo 4.
Captulo 2. Gramtica
Este captulo introduce la gramtica de las partes buenas de JavaScript, presentando una visin
general rpida de cmo est estructurado el lenguaje. Representaremos la gramtica con
diagramas de ferrocarril.
Espacio en blanco
Los espacios en blanco pueden tomar la forma de caracteres de formato o comentarios. Los
espacios en blanco suelen ser insignificantes, pero ocasionalmente es necesario usar espacios en
blanco para separar secuencias de caracteres que de otro modo se combinaran en un solo token.
Por ejemplo, en:
El espacio entre var y that no se puede quitar, pero los otros espacios se pueden quitar.
JavaScript ofrece dos formas de comentarios, bloques de comentarios formados con / * * / y los
comentarios de finalizacin de la lnea comenzando por //. Los comentarios deben ser usados
liberalmente para mejorar la legibilidad de sus programas. Tenga cuidado de que los comentarios
siempre describan con precisin el cdigo. Comentarios obsoletos son peores que ningn
comentario.
La forma / * * / de los comentarios de bloque proceda de un lenguaje llamado PL/I. PL/I escogi
esos pares extraos como los smbolos para los comentarios porque era improbable que ocurriera
en los programas de ese idioma, excepto tal vez en literales de cuerdas. En JavaScript, esos pares
tambin pueden aparecer en literales de expresiones regulares, por lo que los comentarios de
bloque no son seguros para comentar bloques de cdigo. Por ejemplo:
Causa un error de sintaxis. Por lo tanto, se recomienda evitar / * * / comentarios y // se deben usar
los comentarios en su lugar. En este libro, // se utilizar exclusivamente.
Nombres
Un nombre es una letra opcionalmente seguida de una o ms letras, dgitos o barras inferiores. Un
nombre no puede ser una de estas palabras reservadas:
La mayora de las palabras reservadas en esta lista no se utilizan en el idioma. La lista no incluye
algunas palabras que deberan haber sido reservadas pero que no fueron, como undefined, NaN
e Infinity. No se permite nombrar una variable o un parmetro con una palabra reservada. Peor
an, no se permite usar una palabra reservada como el nombre de una propiedad de objeto en un
literal de objeto o despus de un punto en un refinamiento.
JavaScript tiene un solo tipo de nmero. Internamente, se representa como punto flotante de 64
bits, igual que el doble de Java. A diferencia de la mayora de los otros lenguajes de programacin,
no hay ningn tipo entero separado, por lo que 1 y 1,0 son el mismo valor. Esta es una
conveniencia significativa porque los problemas de desbordamiento en enteros cortos se evitan
por completo, y todo lo que necesita saber acerca de un nmero es que es un nmero. Se evita
una clase grande de errores de tipo numrico.
Si un literal de nmero tiene una parte de exponente, entonces el valor del literal se calcula
multiplicando la parte antes de e por 10 elevada a la potencia de la parte despus de la e. As que
100 y 1e2 son el mismo nmero.
El valor NaN es un valor numrico que es el resultado de una operacin que no puede producir un
resultado normal. NaN no es igual a ningn valor, incluyendo a s mismo. Puede detectar NaN con
la funcin isNaN (nmero).
El valor Infinity representa todos los valores mayores que 1.79769313486231570e + 308.
Los nmeros tienen mtodos (vase el captulo 8). JavaScript tiene un objeto Math que contiene un
conjunto de mtodos que actan sobre los nmeros. Por ejemplo, el mtodo Math.floor (nmero)
se puede utilizar para convertir un nmero en un entero.
String
Un literal de cadena puede ser envuelto en comillas simples o comillas dobles. Puede contener
cero o ms caracteres. La \ (barra invertida) es el carcter de escape. JavaScript se cre en un
momento en que Unicode era un juego de caracteres de 16 bits, por lo que todos los caracteres en
JavaScript tienen 16 bits de ancho.
JavaScript no tiene un tipo de carcter. Para representar un carcter, haga una cadena con slo un
carcter.
Las secuencias de escape permiten insertar caracteres en cadenas que normalmente no estn
permitidas, como barras invertidas, comillas y caracteres de control. La convencin \u permite
especificar numricamente los puntos del cdigo de caracteres.
Las cadenas son inmutables. Una vez que se hace, una cadena nunca se puede cambiar. Pero es
fcil hacer una nueva cadena concatenando otras cadenas junto con el operador (+).
Dos cadenas que contienen exactamente los mismos caracteres en el mismo orden se consideran
la misma cadena. Asi que:
'c' + 'a' + 't' === 'cat' -> true
Declaraciones
Cuando se utiliza dentro de una funcin, la instruccin var define las variables privadas de la
funcin.
Las sentencias switch, while, for y do estn permitidas tener un prefijo de etiqueta opcional que
interacta con la sentencia break.
Las declaraciones tienden a ser ejecutadas en orden de arriba a abajo. La secuencia de ejecucin
puede ser alterada por las sentencias condicionales (if y switch), por las sentencias looping
(while, for y do), por las sentencias disruptivas (break, return y throw) y por invocacin de
funcin.
La instruccin switch realiza una ramificacin multipunto. Compara la expresin de igualdad con
todos los casos especificados. La expresin puede producir un nmero o una cadena. Cuando se
encuentra una coincidencia exacta, se ejecutan las sentencias de la clusula de coincidencia del
caso. Si no hay coincidencia, se ejecutan las instrucciones opcionales predeterminadas.
Una clusula case contiene una o ms expresiones de caso. Las expresiones de caso no necesitan
ser constantes. La declaracin que sigue a una clusula debe ser una declaracin disruptiva para
evitar caer en el siguiente caso. La instruccin break se puede utilizar para salir de un switch.
El otro formulario (llamado en) enumera los nombres de propiedad (o claves) de un objeto. En
cada iteracin, se asigna otra variable de nombre de propiedad del objeto a la variable.
Por lo general, es necesario probar object.hasOwnProperty (variable) para determinar si el
nombre de la propiedad es realmente un miembro del objeto o se encontr en su lugar en la
cadena de prototipos.
La sentencia try ejecuta un bloque y captura las excepciones que fueron lanzadas por el bloque.
La clusula catch define una nueva variable que recibir el objeto de excepcin.
La sentencia throw genera una excepcin. Si la sentencia throw est en un bloque try, entonces
control va a la clusula catch. De lo contrario, la funcin de invocacin es abandonada, y el control
va a la clusula catch del try en la funcin de llamada.
La expresin suele ser un objeto literal que contiene una propiedad de nombre y una propiedad de
mensaje. El receptor de la excepcin puede usar esa informacin para determinar qu hacer.
La instruccin return provoca la devolucin anticipada de una funcin. Tambin puede especificar
el valor a devolver. Si no se especifica una expresin de retorno, el valor de retorno ser
undefined.
La instruccin break produce la salida de una instruccin loop o una instruccin switch.
Opcionalmente puede tener una etiqueta que causar una salida de la declaracin etiquetada.
JavaScript no permite un final de lnea entre el break y la etiqueta.
Una sentencia de expresin puede asignar valores a una o ms variables o miembros, invocar un
mtodo, eliminar una propiedad de un objeto. El operador = se utiliza para la asignacin. No lo
confunda con el operador de igualdad ===. El operador + = puede agregar o concatenar.
Expressions
Las expresiones ms simples son un valor literal (como una cadena o un nmero), una variable, un
valor incorporado (verdadero, falso, nulo, indefinido, NaN o Infinito), una expresin de invocacin
precedida de new, una expresin de refinamiento precedida Por delete, una expresin envuelta
entre parntesis, una expresin precedida por un operador prefijo o una expresin seguida por:
Un operador infix y otra expresin
Los ? Ternario seguido por otra expresin, luego por:, y luego por otra expresin
Una invocacin
Un refinamiento
Los ? Operador ternario toma tres operandos. Si el primer operando es verdadero, produce el valor
del segundo operando. Pero si el primer operando es falso, produce el valor del tercer operando.
Los operadores que se encuentran en la parte superior de la lista de precedentes del operador en
la Tabla 2-1 tienen mayor precedencia. Se atan los ms apretados. Los operadores en la parte
inferior tienen la precedencia ms baja. Los parntesis se pueden usar para alterar la precedencia
normal, as que:
Los valores producidos por typeof son 'number', 'string', 'boolean', 'undefined', 'function' y
'object'. Si el operando es un array o null, entonces el resultado es 'object', lo cual es
incorrecto. Habr ms sobre typeof en el Captulo 6 y Apndice A.
El operador / puede producir un resultado sin integrar incluso si ambos operandos son enteros. El
operador && produce el valor de su primer operando si el primer operando es false. De lo
contrario, produce el valor del segundo operando.
El || Operador produce el valor de su primer operando si el primer operando es verdico. De lo
contrario, produce el valor del segundo operando.
Un refinamiento se utiliza para especificar una propiedad o elemento de un objeto o array. Esto se
describir en detalle en el prximo captulo.
Literales
Los literales de objetos son una notacin conveniente para especificar nuevos objetos. Los
nombres de las propiedades se pueden especificar como nombres o como cadenas. Los nombres
se tratan como nombres literales, no como nombres de variable, por lo que los nombres de las
propiedades del objeto deben ser conocidos en tiempo de compilacin. Los valores de las
propiedades son expresiones. Habr ms acerca de los literales de objetos en el prximo captulo.
Los literales de arrays son una notacin conveniente para especificar nuevos arrays. Habr ms
acerca de los literales de array en el Captulo 6.
Funciones
Una funcin literal define un valor de funcin. Puede tener un nombre opcional que puede
usar para llamarse recursivamente. Puede especificar una lista de parmetros que
actuarn como variables inicializadas por los argumentos de invocacin. El cuerpo de la
funcin incluye definiciones de variables y declaraciones. Habr ms informacin sobre
las funciones en el Captulo 4.
Captulo 3. Object
Los tipos simples de JavaScript son nmeros, cadenas, booleanos (true y false), null y undefined.
Todos los dems valores son objetos. Los nmeros, las cadenas y los booleanos son similares a los
objetos, ya que tienen mtodos, pero son inmutables. Los objetos en JavaScript son mutable keyed
collection. En JavaScript, los arrays son objetos, las funciones son objetos, las expresiones
regulares son objetos y, por supuesto, los objetos son objetos.
Los objetos en JavaScript no tienen clase. No hay ninguna restriccin en los nombres de las nuevas
propiedades o en los valores de las propiedades. Los objetos son tiles para recopilar y organizar
datos. Los objetos pueden contener otros objetos, por lo que pueden representar fcilmente
estructuras de rbol o de grfico.
JavaScript incluye una caracterstica de enlace de prototipo que permite a un objeto heredar las
propiedades de otro. Cuando se utiliza bien, esto puede reducir el tiempo de inicializacin de
objetos y el consumo de memoria.
Literales de objetos
Los literales de objetos proporcionan una notacin muy conveniente para crear nuevos
valores de objeto. Un objeto literal es un par de llaves que rodean cero o ms pares
nombre / valor. Un literal de objeto puede aparecer en cualquier lugar donde pueda
aparecer una expresin:
El nombre de una propiedad puede ser cualquier cadena, incluyendo la cadena vaca. Las
comillas alrededor del nombre de una propiedad en un literal de objeto son opcionales si
el nombre sera un nombre JavaScript legal y no una palabra reservada. As que las citas
se requieren alrededor de "firstname", pero son opcionales alrededor de first_name. Las
comas se utilizan para separar los pares.
El valor de una propiedad se puede obtener de cualquier expresin, incluyendo otro
literal de objeto. Los objetos pueden anidar:
Recuperacin
Los valores se pueden recuperar de un objeto envolviendo una expresin de cadena en
un sufijo []. Si la expresin string es una constante, y si es un nombre JavaScript legal y
no una palabra reservada, entonces el archivo. Notacin se puede utilizar en su lugar. Los
. Se prefiere la notacin porque es ms compacta y se lee mejor:
Si intenta recuperar valores undefined, lanzar una excepcin TypeError. Esto puede protegerse
con el operador &&:
Update
Un valor en un objeto se puede actualizar mediante asignacin. Si el nombre de propiedad ya
existe en el objeto, se reemplazar el valor de la propiedad:
Prototype
Cada objeto est vinculado a un objeto prototipo del que puede heredar propiedades. Todos los
objetos creados a partir de literales de objeto estn vinculados a Object.prototype, un objeto que
viene de serie con JavaScript.
Cuando crea un nuevo objeto, puede seleccionar el objeto que debe ser su prototipo. El
mecanismo que proporciona JavaScript para hacer esto es desordenado y complejo, pero puede
simplificarse significativamente. Vamos a agregar un mtodo create a la funcin Object. El
mtodo create crea un nuevo objeto que utiliza un objeto antiguo como su prototipo. Habr
mucho ms acerca de las funciones en el prximo captulo.
El enlace del prototype no tiene ningn efecto en la actualizacin. Cuando realizamos cambios en
un objeto, no se toca el prototipo del objeto:
El enlace de Prototype slo se utiliza en la recuperacin. Si tratamos de recuperar un valor de
propiedad de un objeto y si el objeto carece del nombre de propiedad, JavaScript intenta recuperar
el valor de la propiedad del objeto Prototype. Y si ese objeto carece de la propiedad, entonces va a
su Prototype, y as sucesivamente hasta que el proceso finalmente termina con Object.prototype.
Si la propiedad deseada no existe en ninguna parte de la cadena de prototipos, el resultado es el
valor indefinido. Esto se llama delegacin.
Reflexin
Es fcil inspeccionar un objeto para determinar qu propiedades tiene intentando recuperar las
propiedades y examinar los valores obtenidos. El operador typeof puede ser muy til para
determinar el tipo de propiedad:
Se debe tener cuidado porque cualquier propiedad en la cadena de prototipos puede producir un
valor:
Existen dos enfoques para tratar estas propiedades no deseadas. El primero es hacer que su
programa busque y rechace los valores de las funciones. Generalmente, cuando ests
reflexionando, te interesan los datos, por lo que debes tener en cuenta que algunos valores
podran ser funciones.
El otro enfoque es utilizar el mtodo hasOwnProperty, que devuelve true si el objeto tiene una
propiedad particular. El mtodo hasOwnProperty no mira la cadena de prototype:
Enumeracin
La sentencia for in puede realizar bucle sobre todos los nombres de propiedad de un objeto. La
enumeracin incluir todas las propiedades, incluidas las funciones y las propiedades del prototipo
en las que quizs no est interesado, por lo que es necesario filtrar los valores que no desea. Los
filtros ms comunes son el mtodo hasOwnProperty y el uso de typeof para excluir funciones:
No hay garanta en el orden de los nombres, as que preprate para que los nombres aparezcan en
cualquier orden. Si desea asegurarse de que las propiedades aparecen en un orden en particular,
lo mejor es evitar la sentencia for en su totalidad y, en su lugar, crear una array que contenga los
nombres de las propiedades en el orden correcto:
first-name: MAriana
middle-name: Lester
last-name: Howard
profession: undefined
Usando para el lugar de para en, pudimos conseguir las propiedades que buscaban sin
preocuparnos por lo que poda ser dragado de la cadena de prototipos, y los conseguimos en el
orden correcto.
Borrar - delete
El operador delete se puede utilizar para quitar una propiedad de un objeto. Eliminar una
propiedad del objeto si la tiene. No tocar ninguno de los objetos del enlace del prototipo.
Eliminar una propiedad de un objeto puede permitir que una propiedad del enlace de prototipo
brille a travs de:
Variables Globales
JavaScript hace que sea fcil definir variables globales que pueden contener todos los activos de
su aplicacin. Desafortunadamente, las variables globales debilitan la resiliencia de los programas
y deben ser evitadas.
Una forma de minimizar el uso de variables globales es crear una nica variable global para su
aplicacin:
Una funcin incluye un conjunto de sentencias. Las funciones son la unidad modular fundamental
de JavaScript. Se utilizan para la reutilizacin del cdigo, la ocultacin de la informacin y la
composicin. Las funciones se utilizan para especificar el comportamiento de los objetos.
Generalmente, el arte de la programacin es el factoraje de un conjunto de requisitos en un
conjunto de funciones y estructuras de datos.
Function Objects
Las funciones en JavaScript son objetos. Los objetos son colecciones de pares nombre / valor que
tienen un vnculo oculto con un objeto prototipo. Los objetos producidos a partir de literales de
objeto estn vinculados a Object.prototype. Los objetos de funcin estn vinculados a
Function.prototype (que est vinculado a Object.prototype). Cada funcin tambin se crea con dos
propiedades ocultas adicionales: el contexto de la funcin y el cdigo que implementa el
comportamiento de la funcin.
Cada objeto de funcin tambin se crea con una propiedad de prototype. Su valor es un objeto con
una propiedad constructor cuyo valor es la funcin. Esto es distinto del enlace oculto a
Function.prototype. El significado de esta complicada construccin se revelar en el prximo
captulo.
Dado que las funciones son objetos, pueden utilizarse como cualquier otro valor. Las funciones
pueden almacenarse en variables, objetos y arrays. Las funciones se pueden pasar como
argumentos a las funciones, y las funciones se pueden volver de las funciones. Adems, puesto
que las funciones son objetos, las funciones pueden tener mtodos.
Funcin Literal
Los objetos de funcin se crean con literales de funcin:
Una funcin literal tiene cuatro partes. La primera parte es la funcin de palabra reservada.
La segunda parte opcional es el nombre de la funcin. La funcin puede usar su nombre para
llamarse recursivamente. El nombre tambin puede ser utilizado por depuradores y herramientas
de desarrollo para identificar la funcin. Si una funcin no recibe un nombre, como se muestra en
el ejemplo anterior, se dice que es annima.
El operador de invocacin es un par de parntesis que siguen cualquier expresin que produce un
valor de funcin. Los parntesis pueden contener cero o ms expresiones, separadas por comas.
Cada expresin produce un valor de argumento. Cada uno de los valores de los argumentos se
asignar a los nombres de los parmetros de la funcin. No hay ningn error de tiempo de
ejecucin cuando el nmero de argumentos y el nmero de parmetros no coinciden. Si hay
demasiados valores de argumento, los valores de argumento extra se ignorarn. Si hay pocos
valores de argumento, el valor indefinido se sustituir por los valores faltantes. No hay ninguna
comprobacin de tipos en los valores de los argumentos: cualquier tipo de valor se puede pasar a
cualquier parmetro.
Un mtodo puede usar esto para acceder al objeto para que pueda recuperar valores del objeto o
modificar el objeto. La vinculacin de esto con el objeto ocurre en el momento de la invocacin.
Esta vinculacin muy tarda hace que las funciones que utilizan este altamente reutilizable.
Mtodos que obtienen su contexto de objeto de esto se llaman mtodos pblicos.
Cuando se invoca una funcin con este patrn, sta est enlazada al objeto global. Esto fue un
error en el diseo del lenguaje. Si el lenguaje hubiera sido diseado correctamente, cuando se
invocara la funcin interna, esto seguira vinculado a esta variable de la funcin externa. Una
consecuencia de este error es que un mtodo no puede emplear una funcin interna para ayudarle
a hacer su trabajo porque la funcin interna no comparte el acceso del mtodo al objeto como su
esto est atado al valor incorrecto. Afortunadamente, hay una solucin fcil. Si el mtodo define
una variable y asigna el valor de sta, la funcin interna tendr acceso a sta a travs de esa
variable. Por convencin, el nombre de esa variable es que:
Esto es una salida radical de la moda actual. La mayora de los idiomas de hoy son clsicos. La
herencia prototpica es poderosamente expresiva, pero no se entiende ampliamente. El propio
JavaScript no confa en su naturaleza prototpica, por lo que ofrece una sintaxis de creacin de
objetos que recuerda a las lenguas clsicas. Pocos programadores clsicos encontraron que la
herencia prototpica era aceptable, y la sintaxis de inspiracin clsica oscurece la verdadera
naturaleza prototpica del lenguaje. Es lo peor de ambos mundos.
Si se invoca una funcin con el nuevo prefijo, se crear un nuevo objeto con un vnculo oculto con
el valor del miembro prototipo de la funcin, y ste se enlazar a ese nuevo objeto.
El mtodo apply nos permite construir un array de argumentos para invocar una funcin. Tambin
nos permite elegir el valor de esto. El mtodo apply toma dos parmetros. El primero es el valor
que debe estar vinculado a esto. La segunda es un array de parmetros.