Muy bien, así que hoy, Voy a estar hablando acerca de JavaScript y cómo es diferente de otros lenguajes que es posible que Utilizamos a como PHP. Así, en la última conferencia sobre Lunes, hablamos un poco sobre lo que es parecido, lo que es familiar entre JavaScript y PHP o Python o Ruby o C u otros lenguajes que ya está familiarizado. Pero en realidad JavaScript tiene una opinión muy singular en el modelo de objetos que hace que tipo de completamente diferente que la mayoría de lenguajes que usted va a tratar. Así que las funciones son una especie de underappreciated concepto en JavaScript. Ellos son mucho más poderosos que lo son en otros idiomas porque pueden en - por una razón, que son capaces de ser establecer como valores. Así que aquí tenemos var x es igual a la función y es una primera clase valor que se puede pasar alrededor como un argumento. Así que usted no tiene que declarar la función x y sólo tiene que utilizar x en ese ámbito. Puede pasar el valor de x en cualquier lugar a lo largo de, usted sabe, como argumento en otra función donde se puede módulo de exportación como David mencionó en el nodo. Así que el siguiente punto es que una función es una objeto en JavaScript. Así que en realidad se puede establecer propiedades como valores en una función y simplemente tratar como si fuera un objeto. Así que cuando se trabaja con jQuery, ya sabes, ese dólar y luego se pasa un selector en ella e invocarlo como una función. Pero entonces también han dólar dot AJAX. Y eso no tipo de sentido si usted piensa de una función sólo como algo que se puede invocar o llamada. Pero JavaScript le permite establecer las propiedades de las funciones propiedades estáticas con sólo x someProp dot como señalé ahí. El siguiente punto que estamos va a entrar en un poco más en profundidad es el hecho de que funciones pueden ser tratados como clases en JavaScript. Así que no es el concepto de este nuevo operador lo que crea una nueva instancia de la función, junto con una especie de como el cuerpo de la clase como que viene junto con él y vamos a ir en ella un poco más, que se llama el prototipo. Y es lo que hay marcas JavaScript muy singular en comparación a otros idiomas el cual se basa la clase, JavaScript es un prototipo basado. Y a continuación, sólo en la parte inferior hay, función sólo puede ser llamado claramente como lo que estamos acostumbrados. Así que eso no es nada nuevo. Otra cosa que es único es que las matrices son en realidad objetos. No son como los que están en PHP donde se acaba de crear una nueva matriz. Esto es realmente una abreviatura por decir nueva matriz. Y la matriz es en realidad una subclase de un objeto. Así que eso es algo diferente y voy a ir en un poco más de un detalles sobre eso. Y las capacidades de depuración con JavaScript son realmente inigualable por lo que yo he visto. Esta es una captura de pantalla del Inspector Chrome que vamos a se utiliza para el resto de hoy a la presentación. Y para llegar a esto, sólo ir a presentar las herramientas para desarrolladores y abierto Chrome Inspector o puede hacer clic derecho y haga clic en Mostrar elementos que Creo que está en la página HTML o creo que es comando opción J abre esto. Pero vamos a entrar en esto y usted en realidad puede establecer puntos de interrupción como se está ejecutando a través de el código JavaScript y clasificar de evaluar lo que lo local variables son, cuál es el valor de que es esto y lo hace manera más fácil de depurar código. Y no - esto no es obligado a código del lado del navegador pero en realidad se puede ejecutar una instancia de esta Chrome Inspector para su código del lado del servicio de que es realmente fantástico, ya que puede pasar a través de línea a línea como una solicitud entra en su servidor y ver lo que está pasando y jugar con las variables en la consola de aquí abajo. Así que como he mencionado, JavaScript es un lenguaje basado en prototipos lo que significa que hay un conjunto de valores por defecto, que son una especie de oculto para cada función en el punto objeto propiedad prototype. Así que es una especie de un hash de sólo diferentes valores por defecto que cuando se invoca un funcionar con la nueva palabra clave, quienes son establecidos por por defecto como funciones que están disponibles en la instancia. Así que en realidad es muy eficiente para el - que es una forma eficaz de la creación de objetos de memoria inteligente porque el código JavaScript tiempo de ejecución sólo tiene que llevar la cuenta del prototipo del objeto. De alguna manera se apunta a que cuando cretae un nuevo instancia de una clase. Y también se puede imitar herencia como es conocida en lenguajes basados ​​en clases donde tienes suerte así como un presente que se extiende, se extiende que se puede imitar que en JavaScript a través de lo que se llama la cadena de prototipo. Y vamos a ver ejemplos sobre eso. Así que si tu - plugins jQuery en realidad ellos recomiendan jQuery autores de usar dot dólar fn para agregar funcionalidad a la biblioteca jQuery. Y de hecho vamos a saltar a - Por lo tanto, en esta página, contamos con el dólar - Incluí jQuery. Y si lo hace en dólares dot en la consola que mencioné trayendo que a través de cambio de comando J o simplemente ir a Ver, Herramientas para desarrolladores, Developer e ir a la pestaña Fuentes. [Inaudible Observación] Oh, por supuesto. Así que cuando empecé para escribir en una variable, que esté completa-auto para mí lo que se encuentra allí. Así que escribió en dólares y puedo veo creo que Chrome tiene algunas incorporado dólar, dólar y dólar x. Así que ahora mismo sólo quiero dólar y me metieron en un punto. Y entonces me muestra todas las propiedades que están disponibles en el objeto jQuery. Pero si lo hago en dólares prototipo punto, Ahora veo todos los métodos que yo estoy acostumbrado a usar cuando tengo el dólar, el selector y luego me cadeneta que con, ya sabes, agregar la clase o anexar o desenfoque o cualquiera de los similares. Esos son todos los realmente en el prototipo que bajo el capó del jQuery crea una nueva instancia de sí mismo y que tipo de se esconde todo esos detalles de usted. Así que el punto de que yo era haciendo de nuevo por aquí con la función, se en realidad ocultar prototipo de usted y acaba de alias que al dólar dot fn. Así que la mayoría de la gente realmente no se dan cuenta que no es un prototipo bajo los Es. campana - que se puede aprovechar y añadir funcionalidad adicional a cada instancia jQuery si lo desea. De modo que el operador "new" es realmente una especie de difícil de entender al principio. Cuando se llama a una función con "nuevo", que es una totalmente diferente forma de llamar a la función como si usted acaba de llamar sin rodeos. Así que el "nuevo" operador crea lo que se llama una nueva instancia de un objeto o una nueva instancia, se puede pensar del objeto como una clase. Y cuando esto sucede, el valor de este que puede ser familiar con de jQuery, que tipo de ajuste este a lo que es conveniente en el momento. Por lo general, la pusieron a la nodo DOM actual que eres en lo que estás pasando como cada una, o algo por el estilo. Ellos - Este valor se supone a ser el valor de la instancia que ha creado con el "nuevo", que incluye todo lo en la cadena de prototipo y todos de los métodos que usted encontraría como propiedades de prototipo. Así que depende de cómo una función es llamada, lo que el valor de este es. Y está muy confuso si eres nuevo en JavaScript. Pero cada función que se llama tiene un - tiene en este valor. Así que incluso si usted no ha creado una nueva instancia de algo, que este se asume ser global. O bien, puede llamar a una función utilizando el método de llamada donde el método de aplicar en JavaScript. Usted puede la función y especificar lo que esto debe ser. Así que usted puede hacer que sea dinámico, que es realmente de gran alcance sino que también le permite hacer cosas que pueden inducir a error y confuso para otros desarrolladores si no se usan para el hecho. Y jQuery, yo diría hace que sea aún más confuso por lo que es conveniente y se establece al nodo DOM actual. Pero la simple regla para recordar lo que el valor de este es cuando usted está buscando en una llamada funcional es lo que queda del punto. Así que si tienes un objeto y es algo de puntos algo es la función que usted está llamando, entonces el primer valor es lo que el valor de de este es. Así que aquí está un ejemplo de código donde estoy creando un nuevo objeto literal que es sólo el objeto creada con las llaves y yo estoy poniendo nombre a Bob y luego tengo un sayName método que aquí - por lo que el interior de este sayName si yo x punteo sayName, el valor de este es igual a X porque la izquierda del punto es x. Así que si Yo lo llamo x dot sayName, diría Hola Bob. Y entonces otro ejemplo donde en realidad estoy asignando x punto sayName, la función a la variable Y, que como he mencionado en JavaScript que puede asignar funciones a las variables siempre que lo desee, es muy flexible, de esa manera, pero ahora cuando llamo Y, se pierde el contexto de x. Así que ahora es global o si está en modo estricto, Yo creo que es nula o indefinido. Pero - Así que Y no es lo que está esperando aquí si lo que buscas en x y vas llamar sayName, usted está esperando este nombre se supone que es Bob. Pero si lo lograste el objeto y lo llamó por sí mismo, esto es ahora global. Y eso es lo que yo estaba mencionando cuando ves dólar dot esto, a menudo no se piensa en lo que en realidad está pasando. Pero jQuery especie de cuenta de su propio lenguaje específico de dominio para hacer frente a esto y no es lo que usted está acostumbrado en JavaScript. Y lo señalo porque es muy importante para escribir bien estructurada código orientado a objetos en JavaScript para realmente tener un buen conocimiento y comprensión de cómo funciona esto y cómo funciona el modelo de objetos y cómo funciona el nuevo operador. De lo contrario, usted terminará con espaguetis jQuery donde todo es una especie de todo el lugar y sólo se ocupan de la DOM. Si en realidad se puede escribir JavaScript de una manera más estructurada, que hace que sea mucho más fácil para trabajar, para ordenar de separar las preocupaciones del trato con la actualizar el DOM y tratar con la lógica real y el código. Así que echemos un vistazo a una algunos ejemplos de todo eso. Así que tengo algunos ejemplos aquí. Así que esto es sólo un ejemplo sencillo de utilizar un objeto de JavaScript y la adición de unas pocas funciones a ella y luego la creación de una especie de como una aplicación en miniatura. Así que es muy simple en realidad. Lo único que hace es en un primer momento se le solicita su nombre. Así que lo diré de Tim y luego puede cambiar su nombre por el de Bob. Y eso es todo esto aplicación hace. Pero lo que me gustaría señalar fuera es cómo lo hace. Así que tengo este generador de nombres objeto que tiene un método de arranque que pide al usuario por su nombre con sólo llamar a este askForName que aquí se hace el símbolo si el nombre no fue asignado entonces pide de nuevo llamando a este askForName. Y luego, una vez que se obtiene el nombre, se llama a este nombre de la actualización. Así que este continuación, establece el El nombre de usuario en la etiqueta h1. Y si el nombre no es establecido, se genera un error. [Inaudible Observación] Oh, por supuesto. Por lo tanto, establece el El nombre de usuario en la etiqueta h1 llamando setDisplayName que establece el código HTML en el contenedor de nombre JS y Estoy anteponiendo toda mi HTML con selectores JS sólo porque que es un buen hábito a conseguir en sólo para hacer si no fuera tan confuso cuando se utiliza selectores como el identificador de clases o para el estilo y la lógica en su JavaScript aplicaciones de front-end. Porque si usted tiene diferentes grupos de personas que trabajan sobre la base de código y usted tener un selector de allí que el diseñador decide cambiar porque es - no se ven muy bien, por lo que quieren para poner en una nueva clase y tomar fuera el suyo y usted está confiando en él para fines de JavaScript, a continuación, el código se rompe. Es bueno para prefijar y ordenar de espacio de nombres al igual que casi la Clases relacionadas en JavaScript o atributos con un prefijo de JS. Así que esto es bastante simple y se puede ver en todos estos casos estoy llamando a regresar esto al final. Así que esta es una buena hábito para entrar, para darle una valor de retorno válido. En askForName no estoy porque eso tiene sentido que se podrían obtener nombre de nuevo. Pero lo que permite usted pueda hacer a continuación, si regresa esta actualización nombre, es devolver el valor de setDisplayName que es devolver el valor de este. Y eso le permite ordenar de la cadena como usted está acostumbrado en jQuery devolviendo el valor de este cada vez. Esto se refiere a la objetos actuales por lo que podría llamar a este punto askForName punto setDisplayName y que mantendría la valor de esto y permitir que tener una cadena bien allí. Y luego, en - por lo que en este segundo ejemplo. [Pausa] Está bien. Aceptar. Así que vamos a seguir adelante y abrir la consola e iré a mi ficha Fuentes. Vamos a estallar esto en realidad. Así que en el desarrollador de Chrome herramientas que he mencionado, existe esta pieza a la derecha y un - se puede ver esta señal de stop aunque por defecto, que es negro. Pero al pasar el ratón sobre ella, dice: "No hacer una pausa en las excepciones. Haga clic en la pausa todas las excepciones ". Y cuando hace clic en él de nuevo, se vuelve azul. Y ahora que en cualquier momento hay un error que se produce en el código JavaScript que va a detenerse en el punto y le permiten para evaluar lo que está pasando. Por lo tanto - Y eso es realmente una herramienta útil concepto está a punto de señalar. Y luego, si hace clic en de nuevo, se vuelve púrpura y esta es normalmente lo que sigo pulg Sólo se rompe el código cuando hay una excepción que no ha sido capturado. Así que un montón de veces en jQuery para ejemplo, lo intentan capturas para probar si o no un navegador tiene algún tipo de capacidad y continuar desde allí. Esta es sólo cuando hay un error que no ha sido atrapado en un intento de captura. Así que vamos a tratar de presentar un nombre que está en blanco. Así que puedo ver que el código está ahora detenido en el método UpdateName y puedo ratón sobre los nombres y ver que está vacío en blanco. No es igual a blanco. Así que si no nombrar lanzar una nueva error y ahora puedo dar un paso atrás a través de la función columna y decir: "Bueno, donde salió esto ", y ver lo que el valor de cliente es. Por lo tanto, tiene un método askForName, setDisplayName inicio y UpdateName. Y esto es sólo un muy útil manera usted puede ver que todo el las variables que están disponibles en ese ámbito, así como las variables de cerradura, así que cualquier cosa que está cerrada sobre esta función. Y por lo que puedo ver que - lo que el valor del cliente es y lo que el valor de este es. Así que esto porque somos en jQuery es igual al elemento DOM actual. Pero es realmente útil para depurar código romper en errores como este. Otra característica de la Chrome Inspector que en cualquier momento se puede haga clic en las diferentes líneas en la fila y que va a romper en los lugares donde se han establecido puntos de interrupción que están denominados. Así que si hago clic en el la línea se vuelve azul. Así que déjame continuar la ejecución aquí, OK, que se rompió. Y ahora vamos a configurar el nombre a Alice y pulsa en Enviar. Así que ahora puedo ver aún antes de llegar al punto de la actualización de todo, es ahora dejé aquí mismo para que pueda ver que mi este nombre es Alice y entonces puedo seguir - permítanme volver a cargar la página. Muy bien, así que ahora que está a partir de inicio de nuevo, que se ha detenido en este línea y puedo ver ese nombre se encuentra actualmente indefinido. askForName es qué función Es decir, así que eso es también a menudo útil si tiene funciones que son procedentes de diferentes archivos o lugares diferentes en el código, se puede ver donde está, y luego saltar a eso, se resaltarlo. Es tan bueno tener el hábito de la utilización de herramientas de depuración que no son sólo consolar registro de puntos. OK, así que vamos a echar un mirar un segundo ejemplo lo que hace un mayor uso de prototipos como había aludido. Así, en este ejemplo, estamos creando una nueva función llamada CS y esto es capitalizado por lo que el estándar convención en JavaScript es que si un se supone función que se utilizará como un constructor, en contraposición a sólo un normales función, capitalizarla. Así que tengo el capital CS y esto toma un CourseID variables y courseTitle que Me puse a este CourseID, este courseTitle en el constructor. Y entonces yo también puse estudiantes y conferencias como matrices vacías. Así que la razón por la que - Aceptar, por lo que el prototipo propiedades se definieron aquí con - por lo que la plantilla es sólo un simple guión plantilla, una plantilla de subrayado siendo una manera que usted puede - similar a las plantillas que David había mencionado en el servidor, puede acaba de escribir una etiqueta de script que no es un JavaScript guión, pero un HTML de texto y lo que estoy haciendo con jQuery es - no guarda estos abierta, sí, ahí vamos. Con jQuery, se está haciendo la Valor HTML de esta plantilla y luego ejecutarlo a través de la subrayar librerías de utilidades motor de plantillas. Así que la documentación para eso está aquí bajo la plantilla de utilidad pero básicamente se puede leer un poco más al respecto. Pero evalúa esta cadena y lo convierte en una función que entonces podemos pasar datos en y llamar dinámicamente. Los siguientes dos métodos que tengo son addStudent y addLecture. Estos hay que añadirlas a la arreglos internos que me he fijado en el constructor y entonces el método render. Por lo tanto, vamos a crear el nuevo instancia de CS llama 164 que tiene este curso número 164 y el título. Y a continuación, CS50, que tiene CS50 y introducción a CS1 y luego añadir algunos lectures estudiantes y luego llamar CS50 render. Y si se me acaba el código, por lo que Yo estoy haciendo eso con Eval. Uno nunca quiere utilizar la Eval, pero soy sólo una especie de tomar todas las JavaScript es aquí y ejecutarlo sobre la marcha. Se hace en este la plantilla estas nuevas instancias de la clase de CS que tiene las propiedades, por lo que no hemos parado a través y hacer addLecture y addStudent a cada uno. Y como mencioné porque me estoy volviendo esto, Puedo encadenar realidad estos addLecture y addStudent llamadas y que funcionará igual de bien. La otra característica en JavaScript esto es aún más útil en el lado del servidor donde realmente en un momento dado si su aplicación se grande no sabe dónde se encuentra y es más difícil de establecer estos puntos de ruptura individuales que mencioné en Inspector Chrome es utilizar la palabra clave debugger. Así que es sólo D-E-B-U-G-G-E-R. Y cuando se pone un depurador palabra clave en su código y usted tiene la - ahí vamos, dos Gs. Cuando se pone el depurador palabra clave en su código y se está ejecutando un depurador tales como el cromo Inspector aquí o el Chrome lado del servidor Inspector, le dice a JavaScript para detener la ejecución en esa línea del código y que le permite al paso por el resto de la ejecución de los códigos. Así que si hago clic en el código de ejecución aquí, ahora está parada en esta línea depurador y que pueda ver bien, aquí está el valor de CS50 y es un curso tiene título, por supuesto ID, que tiene no hay conferencias, ninguno de los estudiantes. Y entonces puedo pasar por todo el addLecture, Puedo ver que está empujando a estas conferencias, ratón sobre eso, "Hello World". Puedo realmente en el consola de hacer esto por lo que este se establece al objeto actual que usted está adentro Esta conferencia es "Hello World". Y seguir paso a paso a través de todo lo que quiero. Si yo no quiero dar un paso a causa de una llamada a la función ' Yo sé lo que está pasando hacer entrar en addLecture, hay este botón de aquí que dice "paso en la próxima llamada a la función ", y para que pueda ir hasta el punto de si yo soy tal vez preguntando acerca de algo. Como por ejemplo 164 render. Así que en este punto, es va a ser prestados. Puedo ver esta plantilla es la plantilla compilado. Puedo ver en este momento yo debe tener dos estudiantes y dos conferencias. Y luego está el prototipo cadena que me refería. Así que el que viene por defecto junto con sólo un objeto en JavaScript, en general, viene con dos cuerdas valor del constructor. Y a continuación, los que He añadido a mi mismo con la addLecture, addStudent y a continuación, las propiedades que son exclusivas de este instancia de la clase ya que se ha invocado con la palabra clave new. Así que hagamos un solo ejemplo más en esta y luego vamos a paso para algunos las cosas más interesantes en el lado del servidor. Así que vamos a seguir adelante y abrir este último ejemplo, que es - vamos a ver, ¿dónde está el código? Yo no sé de dónde salió. OK, bueno, puede ser que acaba de saltar sobre este código a continuación, en realidad - oh espera, creo que me perdí la hoja de estilo para el código. OK, así que vamos a hacer esto un poco más grande. En este ejemplo, yo estoy mostrando un poco más en el ajuste la cadena de prototipos, por lo que la creación de la herencia con el código JavaScript. Así que en este caso, tenemos un catálogo que se va para mantener presumiblemente múltiples cursos. Y así un catálogo tiene un métodos addCourse. Por lo tanto comprueba si el curso que se pasa en una instancia por supuesto, como se invoca con la palabra clave new. Así que si usted trata de enviar en algo diferente, le grite a usted. El método render que se representar cada uno de los cursos mediante la compilación de su plantilla a continuación. Y tenemos el curso que el acceso en este caso la clase base para cursos de cada departamento. Y en lugar de configurar cada del punto supuesto método dot prototipo o establecimiento en el extienden ayudante en la biblioteca subrayado a una especie de llamada de extender este prototipo con todo de estas propiedades, que es útil, un poco más fácil de leer. Y luego aquí abajo haciendo lo que se conoce como el establecimiento de en la cadena de prototipo. Así que esto es en realidad un poco difícil de la gente en un primer momento e incluso aún habiendo hecho esto por un tiempo, es una especie de disco para envolver su cabeza alrededor. Pero no dejes que eso te asuste. Así que estoy estableciendo una nueva - una clase completamente nueva objetar aquí, CS. Y en el constructor, Estoy diciendo curso aplicar este argumento. Así que los argumentos es un especial valor que supongo que se podría llamar en JavaScript, la palabra clave que tiene todo del todo lo que es pasado a lo largo es argumentos que la función está disponible con los argumentos llaman, con la palabra clave argumentos. Así como yo estoy llamando con el curso dot aplicar, este es el contexto actual con la que CS se está llamando. Así que cuando lo invoco con el nuevo que es una - es un valor de CS. Y lo que digo llamar a este método curso aquí. Oh, lo siento - llamar a este método curso aquí pero establecer el valor de esta a ser lo que el valor de esto es justo aquí. Así que la palabra clave permite aplicar cambiar especie de estado de este que es como jQuery se permite a una especie de interruptor esta en usted como usted va a través de y hacer una serie de elementos DOM en lugar del objeto jQuery. Así que ahora me voy a poner una función temporal que va a captar la prototipo del curso. Y una especie de configurarlo a su prototipo y luego establecer el prototipo sobre la función de objeto CS a una nueva instancia de eso. Así que, básicamente estoy diciendo en su lugar - si yo aquí hice CS dot prototipo es igual a nuevo curso. Entonces sería llamando todo en esta función constructora, que no quiero necesariamente querido. Así que todo lo que estoy haciendo es especie de la creación de casi como una función sustituta que tendrá el prototipo cursos en ella y en cierto modo imitar el prototipo - el curso, pero sin hacer todo en el constructor y establecer que para el prototipo. Y entonces yo sólo soy añadiendo por lo que el departamento en este caso es por ordenador Ciencias para el objeto CS. Y luego tengo una especie de Versión puente de hacerlo. No funciona en IE9. Así que por eso yo quería para mostrar una especie de cómo - lo que esto está haciendo bajo el capó. Pero se puede establecer en la misma manera donde la función es igual a Econ Por supuesto aplicar estos argumentos y luego decir prototipo dot Econ iguales CreateCourse objeto dot prototipo de puntos. Así que ha crea un nuevo objeto que es sólo el prototipo para el curso y luego establecer el departamento de allí. Así que ahora vamos a ir establecer un depurador aquí y haga clic en ejecución. Eso es. Así CS164 podemos ver el cadena de prototipo que tenemos la propiedades que eran establecido en el constructor. Así que los valores de los mismos que se establecen y luego en la cadena de prototipo para el objeto de CS tenía departamento de Ciencias de la Computación establecido. Y luego en el subyacente cadena de prototipo, entonces tenemos todo el métodos y propiedades que son exclusivos de el objeto del curso. Y luego tenemos los objetos de la base. Para que una especie de rápida ejemplo de la cadena de prototipo. Y como se puede ver aquí, hay son dos valores por departamento. Así que no hay departamento de la informática y luego departamento no enumerado que dije como el valor por defecto aquí. Así que la cadena de prototipo es en realidad una forma individual lista de enlaces. Y ya que trata de encontrar una propiedad, va a empezar en el valor de nivel superior. Así que lo que está definido en el la función constructora y luego una especie de ir por el cadena de prototipos a partir de ahí. Así que, ya que se encontró, por lo que - si aquí, digo CS50 Departamento punto, que va a decir Informática. Pero si digo var - [Pausa] Pero si digo humanidades es igual a nuevo curso y entonces yo digo humanidades punto departamento, Voy a ver el departamento que no figuran porque fue a la primera - Puedo mirar el prototipo cadena aquí en realidad. Así que se fue primero en el curso objeto y vio que no hay nada en la cadena de prototipo en este nivel para el departamento o para los valores de departamento así luego salta al siguiente nivel, el curso y se ve remitir allí y lo encuentra. Por lo tanto, sólo una especie de desciende de arriba hacia abajo y que es una especie de algo que es único acerca de que JavaScript está que usted puede cambiar cualquier de estos valores en cualquier momento dado. Así que en el constructor o en una método individual sobre el objeto si quiero establecer este departamento para algo nuevo, o si me quiero ni establecer cualquiera de estas funciones que ya son existir a algo nuevo, Yo soy libre de hacer eso. Así que ahora tengo CS50 dot addLecture, se parece a eso. Y si quiero ponerlo a CS50 addLecture exactamente igual a la función en blanco. Entonces ahora puedo ver que es sólo cambió por completo que usted no es capaz hacer otros idiomas donde se tiene una estricta clase basada herencia y todo es especie de configurar. JavaScript es muy, muy flexibles con respecto a eso. OK, vamos a saltar de nuevo en las diapositivas. Así que si por ejemplo, usted que siempre me gusta una función tener un especial este valor establecido para ello. Usted puede llamar a la función de punto de enlace y establecer cuál es el valor de esto debería ser. Usted puede pensar en él como - "Estoy tratando de pensar en una buen ejemplo del mundo real, pero ", si usted quiere proteger su código contra alguien potencialmente llamándolo con un valor eso no sería esto. Como por ejemplo AJAX callback como exceso o error. Aquellos normalmente no se llaman con una buena semántica valor de este. Y tú estás como: "Bueno, yo siempre quiero que esto sea el valor del objeto de golf que estoy trabajando. O el punto de vista que estoy trabajar con en mi código que representa esta Nodo DOM, se puede establecer - puede enlazar a este contexto y luego, cuando se llama más tarde por jQuery y no tiene un buen valor de esta se pegará a lo que lo bordeaba con. Luego está llamada a la función se puede especificar el contexto y especificar cualquier variable número de argumentos. Y luego está la función aplicar lo que puede pasar en el contexto y entonces o bien una matriz o los argumentos de que los objetos He mencionado como ves allí. Y los argumentos en cualquier función que se llama, que puede simplemente escribir en la palabra "argumentos" y que va a tener toda los argumentos. Tiene una propiedad "de largo" que es como argumentos mayo fueron en realidad pasó a que los métodos de ya que en JavaScript se puede ordenar de llamada con un número variable de argumentos. Es útil para decir si esto tenía un argumento, a continuación, siga esta ruta de código. Si tuviera dos, usted puede ser quiere seguir otro camino. Esto le permite tener realmente API dinámicos para sus métodos. Usted puede pensar en que con jQuery como cuando tienes dólar dot o bind. Y que tipo de hace diferentes cosas si pones un argumento o dos o tres o comenzar con una función. Se está utilizando los argumentos propiedad y los argumentos longitud en una gran cantidad de casos tener esta magia funcionalidad suceda. Las cosas que no puedes hacer con argumentos se utilizan sólo por defecto como una matriz. Así que se puede decir argumentos tres y configurarlo para que algo como se puede usar la asignación de matriz. Usted puede utilizar el - un montón de los métodos de subrayado ya sea para colecciones o para trabajar con matrices, puede pasar en argumentos y se dará cuenta que se trata de un argumento objeto y el tipo de hacerse cargo de eso por ti. Pero si usted desea utilizar el argumentos que se pasan a través de una función como una matriz, puede utilizar subrayado dot dos array. Uno de los número de funciones de utilidad que se estructura en subrayar.