Tipo de referencia
Los tipos de referencia incluyen principalmente: Tipo de objeto, Tipo de matriz, Tipo de fecha, Tipo Regexp, Tipo de función, etc.
Cuando se usan los tipos de referencia, se debe generar un objeto (instancia) a partir de ellos. En otras palabras, un tipo de referencia es equivalente a una plantilla. Cuando queremos usar un cierto tipo de referencia, debemos usar esta plantilla para generar un objeto para usar, por lo que el tipo de referencia a veces se llama definición de objeto.
Por ejemplo, necesitamos generar un objeto de persona para definir la información y el comportamiento personal de alguien, por lo que debemos confiar en el tipo de objeto:
var persona = nuevo objeto (); persona.name = "jiangshui"; persona.sayname = function () {console.log (this.name);}El objeto de persona anterior se define por la "plantilla" utilizando el nuevo operador utilizando el tipo de objeto. Después de eso, puede agregar nombre de atributo y método SayName a este objeto. Las propiedades y los métodos son "funciones" de los tipos de objetos, por lo que se pueden usar objetos creados a través de tipos de referencia como el objeto.
Crear un objeto no necesariamente requiere el uso del nuevo operador. Hay algunos tipos que se pueden simplificar en la creación. Por ejemplo, creando un objeto de objeto de tipo como el anterior, también puede usar los siguientes dos métodos:
var persona = {}; persona.name = "jiangshui"; persona.sayname = function () {console.log (this.name);}o
var persona = {nombre: "jiangshui", sayname: function () {console.log (this.name); }};La función del operador {} es la misma que el nuevo objeto (), simplificando las operaciones. Hay algunas diferencias en los dos métodos de escritura anteriores. El primero es "agregar", es decir, en la definición anterior, continuar agregando atributos o métodos. Si el método de atributo del mismo nombre ya existe antes, se sobrescribirá. El segundo tipo es el "reemplazo", lo que significa que independientemente de si las propiedades y los métodos del objeto de la persona se definen antes, este método reemplazará el contenido definido previamente con el contenido recién definido. Debido a que el objeto generado por el tipo de referencia es una región almacenada en la memoria, y luego su puntero se guarda en una cierta variable (persona), la segunda forma de escribir es generar un nuevo objeto (nuevo área de memoria), y luego señalar la persona variable a la nueva área de memoria, por lo que se reemplaza el anterior. Comprender esto es crucial para la comprensión posterior.
El uso de otros tipos de referencia es aproximadamente el mismo, como el tipo de matriz, que también se puede usar para generar objetos o definirlos directamente. Después de generar un objeto de matriz, puede almacenar el contenido de información en formato de la matriz. Además, el objeto obtendrá los métodos definidos en el tipo de matriz, como Push, Shift, Sort, etc., y puede llamar a estos métodos, como:
var colores = []; colores.push ('rojo', 'verde'); console.log (colores);El código anterior crea un objeto de tipo matriz a través del tipo de matriz, luego llama al método de empuje definido previamente en el tipo de matriz, agrega dos valores rojos y verdes al objeto, y finalmente lo imprime en la consola y puede verlo.
Llamar y aplicar métodos
Estos dos métodos son proporcionados por el tipo de función, lo que significa que pueden usarse en funciones. La función de la llamada es la misma que el método Aplicar, que es que puede expandir el alcance de la operación de función. La diferencia es que al usar llamadas, los parámetros pasados a la función deben estar enumerados uno por uno, pero el método de aplicación no lo usa. De esta manera, puede decidir usar llamadas o aplicar de acuerdo con los requisitos de su propia función.
¿Qué significa el alcance de la operación de la función de expansión? Entenderá dando un ejemplo.
Puede entender de esta manera que la función está envuelta en un contenedor (alcance), y hay algunas variables u otras cosas en este contenedor. Cuando se ejecuta la función, estas variables se llaman, etc., encontrará esto en el contenedor actual. Este contenedor en realidad envuelve un contenedor más grande afuera. Si el contenedor pequeño actual no lo tiene, la función buscará en el contenedor más grande, y así sucesivamente, y encontrará el objeto de ventana del contenedor más grande. Sin embargo, si la función se ejecuta en el contenedor pequeño actual, hay variables correspondientes, etc. En el contenedor pequeño, incluso en el contenedor grande, la función aún lo llamará en su propio contenedor.
Los métodos de llamada y aplicación son para resolver este problema y romper las limitaciones de los contenedores. En cuanto al ejemplo anterior:
var persona = {nombre: "jiangshui", sayname: function () {console.log (this.name); }};Después de abrir la consola Chrome, péguela y ejecutela, y luego ejecute Person.sayName () para ver
En este momento, la persona es un contenedor, que crea un método SayName (función). Al ejecutar, debe ejecutarse bajo el alcance de la persona. Cuando se ejecuta directamente en la parte inferior, es decir, la ejecución debajo del alcance de la ventana causará un error no definido porque el método SayName no está definido debajo de la ventana. Este puntero en el interior es algo especial, que apunta al alcance actual. El significado de este.name es llamar al valor del nombre debajo del alcance actual.
A continuación, agregamos un atributo de nombre al objeto de la ventana:
Window.name = "Yujiangshui";
O directamente
nombre = "yujiangshui";
Debido a que la ventana es el contenedor más grande, se puede omitir la ventana. Todos los atributos o variables definidos están conectados a la ventana. Si no lo crees, puedes ver:
Ahora queremos ejecutar el método SayName en el contenedor pequeño de la persona debajo del gran contenedor de la ventana. Necesitamos usar llamadas o aplicar para expandir el alcance del método SayName. Ejecutar la siguiente declaración:
persona.sayname.call (ventana);
o
persona.sayname.call (esto);
Los resultados de la salida son los mismos. También puede usar Aplicar para ver el efecto, porque esta demostración es demasiado simple y no requiere parámetros de aprobación, por lo que las funciones de llamada y aplicación son completamente consistentes.
Permítanme explicar el código anterior. SayName es primero una instancia del tipo de función, que tiene el método de llamada y el método de aplicación. Dado que los métodos de llamada y aplicación son métodos de función, necesitamos llamar a persona.sayname.call (ventana) de esta manera en lugar de persona.sayname (). Llame (ventana), etc.
Luego, los parámetros de los métodos de llamada y aplicación son un alcance (objeto), lo que indica que la función anterior se ejecuta debajo del alcance que se pasa. Después de pasar el objeto de la ventana, este nombre en el método SayName apunta a Window.name, por lo que el alcance se expande.
¿Por qué pasar la ventana y esto tiene el mismo efecto? Debido a que la ubicación actual de ejecutar esta función es la ventana, como se mencionó anteriormente, este puntero apunta al alcance actual, por lo que este puntero apunta a la ventana, por lo que es igual a la ventana.