¿Qué es un prototipo? Prototipo es un concepto que no mencionamos en el aprendizaje básico de JS. Prototipo es un término general que incluye principalmente. Objeto prototipo (prototipo) , Prototipo de objeto (__proto__) , cadena prototipo Espere, estos conceptos también se preguntan comúnmente en entrevistas según las estadísticas. Este artículo lo ayudará a comprender y dominar los conocimientos relevantes de los prototipos, para que ya no se sienta confundido.
Hemos estudiado muchos lenguajes orientados a objetos, como Java, C ++, etc., pero JavaScript es una excepción. Antes de ES6, no existía el concepto de clases. Resulta que antes de ES6, usábamos constructores para crear objetos instanciados. El constructor es una función especial que contiene las características públicas del objeto. Solo tiene sentido usarlo junto con new .
<script> function Animal(nombre,edad){ //La primera letra del nombre del constructor está en mayúscula this.name=name; esta.edad=edad; this.comer=función(){ console.log('Estoy comiendo'); } } var dog=new Animal('Wangcai',3) // Para usar junto con new para crear un objeto console.log(dog.name); console.log(perro.edad); perro.comer() </script>
<script>. función Animal(nombre,edad){ this.nombre=nombre; esta.edad=edad; } var perro=nuevo Animal('Wangcai',3) console.log(perro.nombre); console.log(Animal.nombre); </script>
<script>. función Animal(nombre,edad){ this.nombre=nombre; esta.edad=edad; } var perro=nuevo Animal('Wangcai',3) Animal.color='negro' console.log(Animal.color); console.log(perro.color); </script>
Antes de comenzar a explicar qué es un objeto prototipo, primero expliquemos un caso. En este momento, creamos múltiples objetos instanciados y generamos los dos métodos. sus objetos instanciados Después de la comparación, encontramos que se generó falso, es decir, las direcciones de los tipos de datos complejos de los dos son diferentes.
<guión> función Animal(nombre,edad){ this.nombre=nombre; esta.edad=edad; this.comer=función(){ console.log('Estoy comiendo'); } } var perro=nuevo Animal('Wangcai',3) var gato=nuevo Animal('Mimi',3) var cerdo=nuevo Animal('humhem',3) var pez=nuevo Animal('Gulu',3) var oveja=nuevo Animal('咩咩',3) console.log(perro.comer==gato.comer); </script>
Cuando creamos un objeto instanciado, el nuevo proceso primero creará un nuevo objeto, pero los tipos de datos complejos abrirán un espacio para almacenar (objetos, métodos), lo que resulta en innumerables aperturas para el mismo método en la memoria del bloque. causando un desperdicio extremo de memoria
El prototipo del constructor es un atributo dentro del constructor. Su atributo es un puntero que apunta a un objeto. Este objeto almacena métodos públicos y luego se utiliza para crear instancias. se puede usar públicamente al convertir objetos y no es necesario abrir múltiples espacios de memoria duplicados para múltiples tipos de datos complejos idénticos. Para resolver el problema de desperdicio de memoria mencionado anteriormente, también se le puede llamar directamente objeto prototipo.
Solución: utilizamos el objeto prototipo para almacenar el método público, dejamos que el objeto instanciado llame al método y comparamos si las direcciones de los dos son las mismas
<script> función Animal(nombre,edad){ this.nombre=nombre; esta.edad=edad; } Animal.prototipo.comer=función(){ console.log('Estoy comiendo'); } var perro=nuevo Animal('Wangcai',3) var gato=nuevo Animal('Mimi',3) perro.comer() gato.comer() console.log(perro.comer==gato.comer); </script>
Descubrimos que no solo se llamó exitosamente a este método, sino que las direcciones de los dos métodos de llamada eran las mismas. Esto demostró que su tipo de datos públicos complejos solo abrió un espacio de memoria, lo que redujo la cantidad de métodos públicos escritos. El constructor antes. El problema del desperdicio de recursos dentro de las funciones.
La función del prototipo de objeto __proto__ es permitirle resolver una pregunta: ¿Por qué se puede utilizar el método agregado al atributo prototipo del constructor al crear una instancia del objeto? Esto se debe a que cada objeto tiene un atributo __proto__ (tenga en cuenta que hay dos guiones bajos antes y después). Este atributo también es un puntero que apunta al prototipo del objeto prototipo de su constructor correspondiente, lo que explica por qué el objeto instanciado puede llamar a métodos. el objeto prototipo.
Debemos tener en cuenta que la función del prototipo de objeto __protp__ es solo proporcionar una dirección para buscar el contenido en el objeto prototipo. No necesitamos usarlo, solo debemos recordarlo. apunta al constructor correspondiente El prototipo del objeto prototipo es
objeto constructor prototipo __proto__ y el prototipo de objeto de la función constructora. un atributo de constructor, por lo que se llama constructor. Se llama constructor porque este atributo apunta al constructor correspondiente. Se utiliza principalmente para registrar a qué constructor se refiere el objeto instanciado
<script>. función Animal(nombre,edad){ this.nombre=nombre; esta.edad=edad; } Animal.prototipo.comer=función(){ console.log('Estoy comiendo'); } var perro=nuevo Animal('Wangcai',4) console.log(perro.__proto__.constructor); console.log(Animal.prototipo.constructor); </script>
Descubrimos que el resultado impreso es de hecho el propio constructor