O que é um protótipo? Protótipo é um conceito que não mencionamos no aprendizado básico de JS. Protótipo é um termo geral que inclui principalmente. Objeto protótipo (protótipo) , Protótipo de objeto (__proto__) , cadeia de protótipos Espere, esses conceitos também são comumente questionados em entrevistas de acordo com as estatísticas. Este artigo irá ajudá-lo a compreender e dominar o conhecimento relevante sobre protótipos, para que você não fique mais confuso.
Estudamos muitas linguagens orientadas a objetos, como Java, C++, etc., mas JavaScript é uma exceção. Antes do ES6, não havia conceito de classes. Acontece que antes do ES6, usávamos construtores para criar objetos instanciados. O construtor é uma função especial que contém as características públicas do objeto. Só faz sentido usá-lo em conjunto com new .
<script> function Animal(name,age){ //A primeira letra do nome do construtor é maiúscula this.name=name; esta.idade=idade; isto.comer=função(){ console.log('Estou comendo'); } } var dog=new Animal('Wangcai',3) //Para ser usado junto com new para criar um objeto console.log(dog.name); console.log(cachorro.idade); cachorro.comer() </script>
<script>. function Animal(nome,idade){ este.nome=nome; esta.idade=idade; } var cachorro=novo Animal('Wangcai',3) console.log(cachorro.nome); console.log(Animal.nome); </script>
<script>. function Animal(nome,idade){ este.nome=nome; esta.idade=idade; } var cachorro=novo Animal('Wangcai',3) Animal.color='preto' console.log(Animal.color); console.log(cachorro.color); </script>
Antes de começar a explicar o que é um objeto protótipo, vamos primeiro explicar um caso. Ainda é a classe Animal. Criamos vários objetos instanciados e produzimos os dois métodos de. seus objetos instanciados. Após comparação, descobrimos que a saída foi falsa, ou seja, os endereços dos tipos de dados complexos dos dois são diferentes.
<roteiro> function Animal(nome,idade){ este.nome=nome; esta.idade=idade; isto.comer=função(){ console.log('Estou comendo'); } } var cachorro=novo Animal('Wangcai',3) var gato=novo Animal('Mimi',3) var porco=new Animal('humhem',3) var peixe=novo Animal('Gulu',3) var ovelha=novo Animal('咩咩',3) console.log(cachorro.eat==gato.eat); </script>
Quando criamos um objeto instanciado, o novo processo criará primeiro um novo objeto, mas tipos de dados complexos abrirão um espaço para armazenamento (objetos, métodos), o que resulta em inúmeras aberturas para o mesmo método na memória do bloco construtor. causando um desperdício extremo de memória
Construtor protótipo protótipo é um atributo dentro do construtor Seu atributo é um ponteiro que aponta para um objeto. Este método pode ser usado para criar instâncias. ser usado publicamente ao converter objetos e não há necessidade de abrir vários espaços de memória duplicados para vários tipos de dados complexos idênticos. Para resolver o problema de desperdício de memória mencionado acima, ele também pode ser chamado diretamente de objeto protótipo.
Solução: Usamos o objeto protótipo para armazenar o método público, deixamos o objeto instanciado chamar o método e comparamos se os endereços dos dois são iguais
<script> function Animal(nome,idade){ este.nome=nome; esta.idade=idade; } Animal.prototype.eat=função(){ console.log('Estou comendo'); } var cachorro=novo Animal('Wangcai',3) var gato=novo Animal('Mimi',3) cachorro.comer() gato.comer() console.log(cachorro.eat==gato.eat); </script>
Descobrimos que esse método não apenas foi chamado com sucesso, mas os endereços dos dois métodos de chamada eram os mesmos. Isso provou que seu tipo de dados complexo público apenas abriu um espaço de memória, reduzindo o número de métodos públicos escritos nele. o construtor antes. O problema do desperdício de recursos dentro das funções.
A função do objeto protótipo __proto__ é permitir que você descubra uma questão: Por que o método adicionado ao atributo protótipo do construtor pode ser usado ao instanciar o objeto? Isso ocorre porque todo objeto possui um atributo __proto__ (observe que há dois sublinhados antes e depois). Esse atributo também é um ponteiro, apontando para o objeto protótipo protótipo de seu construtor correspondente, o que explica por que o objeto instanciado pode chamar métodos em. o objeto protótipo.
Devemos observar que a função do objeto protótipo __protp__ é apenas fornecer uma direção para a busca do conteúdo no objeto protótipo. Não precisamos usá-lo, apenas precisamos lembrar que ele. aponta para o construtor correspondente O protótipo do objeto protótipo é
de objeto construtor protótipo __proto__ e o objeto protótipo protótipo da função construtora tem. um atributo construtor, por isso é chamado de construtor. É chamado de construtor porque este atributo aponta para o próprio construtor correspondente. É usado principalmente para registrar a qual construtor o objeto instanciado se refere
<script>. function Animal(nome,idade){ este.nome=nome; esta.idade=idade; } Animal.prototype.eat=função(){ console.log('Estou comendo'); } var cachorro=novo Animal('Wangcai',4) console.log(cachorro.__proto__.construtor); console.log(Animal.prototype.construtor); </script>
Descobrimos que o resultado impresso é de fato o próprio construtor