introducir
Esto juega un papel muy importante en la programación de varios objetos y se utiliza principalmente para señalar el objeto que llama. Sin embargo, en JavaScript, el rendimiento de esto es muy diferente, especialmente en diferentes contextos de ejecución.
Del artículo anterior sabemos que este también es un atributo en el contexto de ejecución, por lo que está destinado a ser inseparable del contexto de ejecución.
Copie el código de código de la siguiente manera:
activeExecutionContext = {
Voz: {...},
esto: esteValor};
En Javascript, el valor de esto depende del modo de llamada. Hay cuatro modos de llamada: modo de llamada a método, modo de llamada a función, modo de llamada a constructor y modo de llamada de aplicación.
modo de llamada
Patrón de llamada de método
Cuando una función se guarda como propiedad de un objeto, la llamamos método. Cuando se llama a un método, este está vinculado al objeto, es decir, en el patrón de llamada del método, esto apunta al objeto que llama. Esto es muy fácil de entender. Eres un método mío, me perteneces y, por supuesto, esto apunta a mí.
Copie el código de código de la siguiente manera:
var miObjeto = {
valor: 0,
incremento: función (inc) {
this.value += tipo de inc === "número" inc: 1;
}
}
miObjeto.increment();
console.log(myObject.value); //Salida: 1
miObjeto.incremento(3);
console.log(myObject.value); //Salida: 4
Debido a que puede acceder al objeto al que pertenece a través de esto, puede llamar y modificar las propiedades o métodos del objeto a través de él. Como se puede ver en el artículo anterior, this, como miembro de los atributos en el contexto de ejecución, debe crearse cuando se crea el contexto. Toda la vinculación de this al objeto ocurre en el momento de la llamada, que es un ". encuadernación retrasada". Se puede lograr un alto grado de reutilización de este mediante la unión retardada.
Copie el código de código de la siguiente manera:
función mostrarValor(){
console.log(este.valor);
}
var a = {valor: "a"};
var b = {valor: "b"};
a.mostrarValor = mostrarValor;
b.mostrarValor = mostrarValor;
a.showValue(); //Salida "a"
b.showValue(); //Salida "b"
La función showValue en el ejemplo anterior pertenece al enlace retrasado.
patrón de llamada de función
Cuando una función no se llama como método de un objeto, es una llamada de función. En el modo de llamada a función, esto está vinculado al objeto global. (Esto es un error en el diseño del lenguaje)
Copie el código de código de la siguiente manera:
miObjeto.doble = función(){
var eso = esto; //Solución
ayudante var = función(){
console.log(that, ": ", that.value); //Objeto de salida {valor: 4, incremento: función, doble: función} ": " 4
console.log(this, ": ", this.value //Ventana de salida {arriba: Ventana, ventana: Ventana…} ": "indefinido);
}
ayudante(); //Llamar como función
}
Según el pensamiento normal, como salida en la cuarta línea, esto debería apuntar al objeto al que pertenece la función. Sin embargo, debido a problemas en el diseño del lenguaje, esto apunta al objeto global. Esto lo hace aún más misterioso e impredecible. Pero como desarrolladores, esta situación es definitivamente algo que no queremos ver. No es de sentido común jugar a las cartas. Afortunadamente, el remedio también es muy simple en el ejemplo anterior. De esta manera, llamar a eso en el método auxiliar se puede usar como esto, lo cual es simple y conveniente. En cuanto al modo de llamada de función, por qué se comporta así se explicará en detalle más adelante al analizar el tipo de referencia.
Patrón de llamada de constructor
Dado que JavaScript se basa en la herencia prototípica, sus diseñadores quieren que pueda crear objetos a través de nuevos constructores como los lenguajes tradicionales orientados a objetos, realizando programación orientada a objetos. Esto no parece ser una buena idea y resulta un poco vergonzoso dibujar un tigre en lugar de un perro. Una es que es imposible aprender, pero no es necesario aprender. El mecanismo de herencia prototipo de JavaScript ya es muy poderoso, suficiente para cumplir con el polimorfismo de herencia requerido para la orientación a objetos.
Sin más preámbulos, hablemos del patrón de llamada del constructor. El patrón de llamada al constructor es muy simple. Consiste en usar una función como constructor y luego usarla para introducir las propiedades y métodos que desea hacer públicos. como sigue
Copie el código de código de la siguiente manera:
función Persona(nombre, edad){
this.nombre = nombre;
this.age = edad;
this.say = función(){
console.log("nombre: %s, edad: %n", este.nombre, esta.edad);
}
}
var p1 = nueva Persona("jink", 24);
p1.say(); //Nombre de salida: jink, edad: 24
var p2 = nueva Persona("Zhang San", 33);
p2.say();//Nombre de salida: Zhang San, edad: 33
En el ejemplo anterior, podemos ver claramente que esto apunta al objeto creado mediante new y el constructor. ¿Por qué sucede esto? Esto se debe a que cuando se llama al constructor a través de new en JavaScript, el nuevo operador llama al método interno [[Construct]] de la función "Persona", y luego, después de crear el objeto, el método interno [[Call]] es llamado. La misma función "Persona" establece el valor de esto para el objeto recién creado.
aplicar modo de llamada
Una vez creadas todas las funciones en JavaScript, tendrán dos métodos: aplicar y llamar. No quiero explicar en detalle el uso específico de estos dos métodos. Los estudiantes que no lo saben pueden buscar en Baidu. A través de dos métodos, podemos configurar esto manualmente. Aunque no se permite modificar esto durante la creación, si lo configuramos manualmente antes de la creación, ese es otro asunto. Esta configuración es increíble, puedes hacer que tu objeto llame a cualquier método, al igual que puedes hacer que un auto navegue en el mar, un elefante africano corra como un jaguar y un programador toque como un pianista. Jaja, la imaginación siempre es hermosa. Llamar es llamar, pero si la función se puede realizar después de llamar es otra cuestión.
Copie el código de código de la siguiente manera:
programador var = {
nombre: "Programador",
mano: "manos flexibles",
programa: función(){
console.log(this.name+"Escribe código con "+this.hand+".");
}
}
var pianista = {
nombre: "pianista",
mano: "manos flexibles",
jugar: función(){
console.log(this.name+"Reproduce música hermosa con "+this.hand+".");
}
}
var jugador = {
nombre: "atleta",
pie: "Piernas fuertes",
ejecutar: función(){
console.log(this.name+"Usa "+this.foot+" para correr en el campo.");
}
}
//Sigue las reglas
programer.programme(); //Los programadores escriben código con manos flexibles.
pianist.play(); //El pianista usa sus manos flexibles para tocar música hermosa.
player.run(); //Los atletas corren por el campo con piernas fuertes.
//caprichoso
pianist.play.apply(programmer); //Los programadores usan sus manos flexibles para tocar música hermosa.
player.run.apply(programmer); // Los programadores usan undefinido para ejecutar en el campo. Por falta de ejercicio físico no tengo piernas fuertes
Parece interesante ver arriba. El primer parámetro de aplicación es el puntero this en el método de ejecución. De esta manera, podemos tomar prestados los métodos de otras personas y usarlos nosotros mismos en secreto, lo cual es extremadamente conveniente. Este tipo de técnica se utiliza a menudo en algunos marcos.
Resumir
Eso es todo lo que tengo que decir al respecto. Creo que después de leer esto, todos comprenderán cómo determinar esto en diferentes situaciones. Originalmente planeé discutir el objeto de referencia a continuación y explicar el valor de esto en el modo de llamada de método. y el principio del modo de llamada de función, pero tenía miedo de que la longitud fuera demasiado larga, así que decidí utilizar un capítulo aparte para analizar el concepto de objetos de referencia.