Recentemente, quando eu estava aprendendo JavaScript e aprendendo o protótipo de JS orientado a objetos, tenho muitas idéias. Se houver algo errado, espero que possa ser corrigido.
Como uma linguagem orientada a objetos, JS naturalmente tem o conceito de herança, mas não há conceito de classes em JS, portanto não há extensões semelhantes às do Java. Portanto, acho que a herança em JS depende principalmente de protótipos (correntes) em JS.
Então, qual é o protótipo? Sabemos que as funções no JS também são um objeto. Quando criamos uma função, a função realmente possui uma propriedade chamada protótipo. Esse tipo de gênero é chamado de propriedade de protótipo. É um ponteiro que aponta para o objeto de protótipo desta função. Este objeto de protótipo possui uma propriedade padrão chamada construtor. Esse tipo de gênero aponta para uma função que possui um tipo de protótipo.
function Person () {} Person.prototype = {// Construtor: Person; primeiro_name: "guo", hair_color: "preto", cidade: "zhengzhou", ato: function () {alert ("comendo");}};Tomando isso como exemplo, criamos uma pessoa de função pela primeira vez. Esta função possui um protótipo de atributo padrão, apontando para o objeto Pessoa.ProptType. Este objeto possui um atributo padrão construtor (), pessoa.prototype.constructor ---> pessoa. (De fato, o padrão aqui é apontar a objeto, e a correção será feita posteriormente)
O que acontece quando criamos uma instância através de um construtor?
function pessoa () {} pessoa.prototype = {primeiro_name: "guo", hair_color: "preto", cidade: "zhengzhou", ato: function () {alert ("comendo");}}; var menino = nova pessoa (); var menina = nova pessoa ();No momento, precisamos saber que a diferença entre um construtor e uma função no JS é a nova palavra -chave, e uma função que usa o novo operador é um construtor. Quando criamos o objeto de instância da pessoa e o salvamos em garoto, menina, esses dois objetos de instância geram um atributo padrão chamado _proto_ (que pode ser representado por [[protótipo]] no ecmascript5). Esse tipo de gênero aponta para o objeto de protótipo do construtor, ou seja, menino._proto _---> Person.prototype (não tem nada a ver com o construtor). Neste momento, o menino ou a menina pode usar pontos para chamar o tipo de gênero no objeto de protótipo. Neste momento, você deve saber que garoto e menina compartilham o tipo de gênero do objeto de protótipo. Podemos verificar a conclusão acima por ISProtptypeof () ou object.getPrototypeOf () (o valor de retorno desta função é o objeto de protótipo, ou seja, o valor de _proto_).
ALERT (PESOON.PROTOTYPE.ISPOTOTYPEOF (menino)); // true alert (object.getPrototypeof (menino) .first_name); // "guo"
Neste momento, podemos fazer uma verificação adicional. E se criarmos um atributo duplicado com o atributo de objeto Prototype na instância?
var menino = nova pessoa (); var menina = nova pessoa (); boy.hair_color = "vermelho"; alerta (garoto.hair_color); // alerta vermelho (garota.hair_color); // alerta preto (object.getProTypeOf (menino) .Hair_Color); //preto
Pode -se observar que o atributo duplicado declarado na instância bloqueará as propriedades no objeto de protótipo, mas só será substituído e não afetará o tipo de gênero do objeto de protótipo (object.getPrototypeof (garoto). Ao mesmo tempo, você pode usar o operador de exclusão para excluir os atributos declarados pelo objeto de instância para desfazer o efeito de mascaramento. Podemos usar o HasOwnsProperty () para verificar se existe um gênero em uma instância (true) ou em um objeto de protótipo (false).
alerta (Boy.HasownProperty ("Hair_Color")); //verdadeiroVocê pode usar object.keys () para enumerar propriedades.
var key = object.Keys (Person.prototype); alerta (chave);
Depois de aprender, descobriremos que, usando o método de escrita acima para declarar um objeto de protótipo, haverá um problema. O construtor não aponta mais para a pessoa, o que é contrário ao padrão, apontando para uma função que contém o atributo do protótipo. Isso ocorre: toda vez que uma função é criada, um objeto de protótipo será criado automaticamente e esse objeto criará um construtor por padrão. Portanto, aqui nossa essência é reescrever o protótipo padrão; portanto, o novo construtor também se tornou um apontamento para a função de objeto, não mais apontando para a função da pessoa. Se o construtor for realmente importante, você precisará escrever o construtor: pessoa.
Depois disso, precisamos conhecer a dinâmica do protótipo. Alterar as propriedades no objeto de protótipo será refletido na instância, independentemente de a instância ser criada antes ou depois das alterações genéricas do objeto de protótipo.
function pessoa () {} person.prototype = {primeiro_name: "guo", hair_color: "preto", cidade: "zhengzhou", ato: function () {alert ("alimentação");}}; var menino = nova pessoa (); Pessoa.prototype.hobby = "Basketball"; var menina = nova pessoa (); alerta (menino.hobby); //basquetebolConforme mostrado no código acima, mesmo que a modificação das propriedades do objeto de protótipo ocorra após a criação da instância, a instância do garoto ainda compartilha Pessoa.prototype.hobby.
No entanto, essa situação ocorre apenas quando o atributo de objeto de protótipo é modificado. Quando o atributo de objeto de protótipo é completamente reescrito, a criação da instância deve ser colocada após o reescrita do atributo de objeto do protótipo, caso contrário, ocorrerá um erro.
function pessoa () {} var girl = new Person (); Person.Prototype = {First_Name: "Guo", Hair_color: "Black", City: "Zhengzhou", ACT: function () {alert ("Eatation");}}; var menino = nova pessoa (); Pessoa.prototype.hobby = "Basketball"; alerta (menino.hobby); // alerta de basquete (garota.first_name); //indefinidoVoltando à questão do "bloqueio", aprendemos anteriormente que a criação do atributo de um objeto de instância (mesmo nome que um determinado atributo no objeto de protótipo) bloqueará o atributo do objeto de protótipo, mas não afetará outros objetos de instância. Há um erro aqui. Esta situação se aplica apenas aos tipos de dados básicos. Quando o valor do atributo se refere ao tipo, um grande problema ocorrerá. Veja o seguinte código.
function pessoa () {} Person.prototype = {primeiro_name: "guo", hair_color: "preto", amigos: ["nick", "John"], cidade: "zhengzhou", ato: function () {alert ("alimentação");}}; var menino = nova pessoa (); Boy.friends.push ("Mike"); var menina = nova pessoa (); alerta (garoto.friends); // Nick, John, Mike Alert (Girl.friends); // Nick, John, MikePode -se observar que a frase acima não se aplica, porque os amigos existem no objeto de protótipo, não no garoto, portanto sua modificação afetará esse ambiente. (Podemos criar uma propriedade de uma instância de garoto através de garoto.frindes = []) Então, precisamos introduzir uma combinação de padrões de construtor e padrões de protótipo.
função pessoa (hair_color, cidade) {this.hair_color = hair_color; this.city = city; this.friends = ["John", "Nick"]; } Person.prototype = {Construtor: Pessoa, First_Name: "Guo", ACT: function () {alert ("Eatation"); }}; Var Boy = New Pessoa ("Black", "Zhengzhou"); var menina = nova pessoa ("vermelha", "shenyang"); menino.friends.push ("nick"); alerta (garota. amigos); alerta (garoto.friends);Esse modo é o método mais utilizado e mais reconhecido de criar tipos personalizados no ECMAScript e pode até ser usado como um modo padrão.
Mas para os programadores que trabalham em outras línguas orientadas a objetos, esse padrão parece estranho. Para encapsular todas as informações no construtor, o padrão de protótipo dinâmico é exibido. O modo dinâmico usa principalmente uma instrução IF para determinar se o objeto de protótipo precisa ser inicializado para alcançar o objetivo de economizar recursos.
Além disso, existe um modo de construção seguro para se adaptar à situação em que não há atributo compartilhado nem uso disso.
A análise de protótipo acima no JavaScript [recomendado] é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.