Em JavaScript, uma função é um objeto do tipo Function
que contém propriedades e métodos. O protótipo (Prototype)
é um atributo do objeto do tipo Function
.
O atributo prototype
é incluído quando a função é definida e seu valor inicial é um objeto vazio. Não existe um tipo de protótipo definido para funções em JavaScript, portanto o protótipo pode ser de qualquer tipo.
O protótipo é usado para salvar as propriedades e métodos compartilhados do objeto . As propriedades e métodos do protótipo não afetam as propriedades e métodos da função em si.
// Propriedades do tipo de função -> propriedades que todas as funções possuem console.log(Function.prototype); //Definir função function fn() { console.log('esta é a função'); } //O valor padrão do protótipo é o objeto vazio console.log(fn.prototype); //fn {}; // A função contém um construtor --> todos os tipos de referência são na verdade construtores console.log(Number.prototype); console.log(Object.prototype);//{}
Você pode obter o protótipo do objeto das duas maneiras a seguir para definir propriedades e métodos compartilhados:
prototype
do construtorgetPrototype
do método Object objeto (obj).função fn() { console.log('esta é a função'); } //Use a estrutura de sintaxe de atributos do objeto de acesso console.log(fn.prototype); //fn {}; console.log(fn['protótipo']);//fn {} //O tipo de objeto fornece o método getPrototypeOf() console.log(Object.getPrototypeOf(fn));
Object.getOwnPropertyDescriptors()
é usado para obter os descritores de todas as suas próprias propriedades de um objeto.
var resultado = Object.getOwnPropertyDescriptor(Object.prototype,'construtor'); console.log(result) //Os resultados de saída são os seguintes: //{ // valor: [Função: Objeto], // gravável: verdadeiro, // enumerável: falso, // configurável: verdadeiro // }
constructor是在创建函数的时候自动添加的,指向构造函数本身
Você pode definir as propriedades e métodos do protótipo das duas maneiras a seguir:
Constructor.prototype.Attribute name = valor do atributo; Constructor.prototype.Method name = function(){}
Quando precisamos adicionar muitos atributos ao protótipo, é muito problemático escrever
构造函数.prototype.属性名
repetidamente. Podemos modificar diretamente oprototype
inteiro
constructor.prototype = {. Nome do atributo: valor do atributo, Nome do método: function(){}}
function foo () {}foo.prototype = { construtor: foo, nome: 'geléia', idade: 18, address: 'Beijing'}var fn = new foo()console.log(fn.address) //Pequim
Cada objeto terá um método isPrototypeOf()
, que é usado para determinar se o objeto é um protótipo de outro objeto.
O código de exemplo é o seguinte: // Define o objeto através do inicializador var obj = { nome: 'jam' } //Define a função construtora Hero() {} // Atribui o objeto obj ao protótipo do construtor Hero Hero.prototype = obj; // Cria o objeto através do construtor var hero = new Hero(); // O método isPrototypeOf() determina se o objeto especificado é o protótipo de outro objeto var result = obj.isPrototypeOf(hero); console.log(resultado);//true
verifica se
obj
é o protótipohero
Em seguida, usamos um trecho de código para expandir nossa compreensão da cadeia de protótipos:
Cenário : Encontre os objetos no objeto obj Etapas executadas pelo atributo de endereço js: 1. A operação get será acionada 2. Pesquise o atributo no objeto atual 3. Se não for encontrado, ele irá pesquisar no objeto da cadeia de protótipos (__proto__) neste momento. Se não for encontrado, ele continuará pesquisando ao longo da cadeia de protótipos até que o protótipo de nível superior seja encontrado (o que é o protótipo de nível superior não está temporariamente claro).
var obj = {. nome: 'geléia', idade: 19 } /* Requisito: Encontre o atributo de endereço no objeto obj*/ // A cadeia de protótipos é pesquisada camada por camada. Se não for encontrada, será pesquisada até que o protótipo de nível superior seja encontrado. obj.__proto__.__proto__ = {} obj.__proto__.__proto__.__proto__ = { endereço: 'Pequim' } console.log(obj.address) // Pequim console.log(obj.__proto__.__proto__.__proto__) // { endereço: 'Pequim' }
Finalmente encontre o atributo de endereço
那么这里有一个问题,如果一直没有查到,会无穷尽的去查找吗?接下来我们就来了解一下
Como mencionamos acima, não pesquisaremos indefinidamente ao longo da cadeia de protótipos. Quando o protótipo de nível superior for encontrado, undefined
será retornado se ainda não tiver sido encontrado.
Então, qual é o protótipo de nível superior?
O código de exemplo é o seguinte:
var obj = { name: 'jam' }console.log(obj.__proto__) // {}console.log(obj.__proto__.__proto__) //
O protótipo do objeto literal nulo obj é:
{}
.{}
é o protótipo de nível superior. Quando continuamos a imprimir__proto__
para cima, um valor nulo é retornado, o que prova que a camada anterior já é o protótipo de nível superior
. está faltando no primeiro trecho de código:
顶层原型就是Object.prototype
3.1 Então, onde está o fim da cadeia de protótipos? Por exemplo, o terceiro objeto também possui um atributo protótipo __proto__
?
var obj = {nome:'jam'}obj.__proto__ = {}obj.__proto__.__proto__ = {}obj.__proto__.__proto__.__proto__ = {}console.log(obj.__proto__.__proto__.__proto__.__proto__) // {}
Descobrimos que o resultado impresso acima é空对象{}
var obj = { nome: 'geléia', idade: 19 } console.log(obj.__proto__) // {} console.log(Object.prototype) // {} console.log(obj.__proto__ === Object.prototype) // true
Object é a classe pai de todas as classes, então obj.__proto__ é na verdade Object.prototype,
console.log(obj.__proto__ === Object.prototype) // true
podemos ver que o resultado Object.prototype é o protótipo de nível superior.
{}
3.2 Então podemos perguntar. : {}
Há algo especial sobre protótipos?
console.log(obj.__proto__.__proto__.__proto__.__proto__.__proto__) // null
Object.prototype
seja um objeto vazio {}, ele não está vazio, mas as propriedades internas não são constructor
. propriedade para ver <!-- Pode-se ver que existe um atributo construtor e não está vazio -->console.log(Object.prototype.constructor) // [Function: Object] <!-- construtor refere-se a Object -->
Object.prototype
através do método Object.getOwnPropertyDescriptors()
. console.log(Object.getOwnPropertyDescriptors(Object.prototype)) //Conforme mostrado na longa captura de tela abaixo