A herança em JavaScript é bastante estranha. Ele não pode implementar a herança da interface e só pode confiar na herança do protótipo.
Cadeia de protótipo
Um protótipo é um objeto. A instância criada através do construtor terá um ponteiro para o protótipo para obter as propriedades e métodos do protótipo. Dessa maneira, o objeto de instância possui o método de atributo do construtor e o método de atributo do protótipo e aponta o protótipo do construtor que precisa ser herdado a essa instância, para que todos os métodos de atributo da instância possam ser herdados.
Veja o seguinte código de demonstração:
// Declare a superclasse, adicione propriedades e métodos relevantes por meio de construtores e protótipos função super () {this.Property = true;} super.prototype.getSuperValue = function () {return this.Property;}; // declara a função de construtor) superclass e obtenha tudo na superclasse subtype.prototype = new super (); subtype.prototype.constructor = subtype; subtype.prototype.getsubValue = functcls () {return this.subProperty;} // cria um objeto de um subclass para testar se o sweatcher a swelTerCl () console.log (instance.getSuperValue ());O protótipo padrão de todas as funções é uma instância do objeto; portanto, o protótipo padrão conterá um ponteiro interno para objeto.prototipo.
Use a instância de e o ISPrototypeof para determinar a relação entre protótipos e instâncias:
Instância da instância de object; object.prototype.isPrototypeof (Instância);
Ao usar cadeias de protótipo, você precisa definir o método com cuidado. As subclasses precisam reescrever um método ou extensão do supertipo e devem ser colocadas após a declaração que substitui o protótipo, para que possa entrar em vigor. Além disso, ao herdar através de uma cadeia de protótipos, você não pode usar os literais de objetos para criar um método de protótipo, que substituirá a cadeia de protótipo:
...... subtype.prototype = new super (); subtype.prototype = {....};Isso substitui o ponteiro para apontar para o novo objeto, reescrevendo a cadeia de protótipo.
O método de herança das cadeias de protótipo é falho e há dois problemas principais:
1. De um protótipo que contém o valor do tipo de referência, ele será compartilhado por todas as instâncias.
Conforme mencionado no artigo anterior, os atributos do protótipo contendo valores de tipo de referência serão compartilhados por todas as instâncias. Uma instância será modificada e as outras instâncias mudarão de acordo. Portanto, os atributos precisam ser definidos no construtor. Quando a cadeia do protótipo herda, não importa se os atributos da superclasse são definidos no construtor ou no protótipo, todos se tornam objetos de instância e são herdados por subclasses, tendo um impacto nas instâncias da subclasse.
2. Ao criar uma instância de um subtipo, os parâmetros não podem ser passados para o construtor de supertipo.
A herança da cadeia de protótipo aponta diretamente o protótipo de subclasse para a instância da superclasse e, neste momento, os parâmetros podem ser passados para a superclasse. No entanto, quando uma subclasse cria uma instância, ele só pode passar os parâmetros para o construtor da subclasse, mas não para o construtor da superclasse.
Portanto, em aplicações práticas, as cadeias de protótipo raramente são usadas sozinhas.
Algumas práticas de código relacionadas
Identifique um atributo de protótipo
função hasprototypeProperty (objeto, nome) {retorna o nome no objeto &&! Object.HasownProperty (nome);}Usando protótipo objetos em construtores
function pessoa (nome) {this.name = name;} pessoa.prototype = {construtor: pessoa, SayName: function () {console.log (this.name); }, ToString: function () {}}; var pessoa1 = new Pessoa ('nicholas'); var pessoa2 = new Person ('Greg); console.log (pessoa 1 instância de pessoa); // TrueConsole.log (Person1.Constructor === Person); // TrueConsole.log (Person1.Constructor === Person); // TrueConsole.log (Person1.Constructor === Object); // FalSeconsole.log (PERSOL2 Instância de pessoa); // TrueConsole.log (Person2.Constructor === Person); // TrueConsole.log (Person2.Constructor === Object); // falseHerança de objeto
var Person1 = {Nome: 'Nicholas', SayName: function () {console.log (this.name); }}; var person2 = object.create (Person1, {nome: {configurável: true, enumerável: true, valor: 'Greg', Writitable: True}}); Person1.SayName (); // nicholasperson2.sayName (); // Gregconsole.log (Person1.HasownProperty ('SayName')); // TrueConsole.log (Person1.isPropertyof (Person2)); // TrueConsole.log (Person2.HasownProperty ('SayName')); // falseModo de módulo
var pessoa = (function () {var Age = 25; function getage () {retorna idade;} função Growolder () {Age ++;} return {Name: 'Nicholas', Getage: Getage, Growolder: Growolder};} ());Construtor de escopo
function pessoa (nome) {this.name = name;} pessoa.prototype.sayname = function () {console.log (this.name);}; var pessoa1 = pessoa ('nicholas'); console.log (pessoa1 instância de pessoa); // Falseconsole.log (tipoof Person1); // undefinedconsole.log (nome); // Nicholas