Esta figura mostra novamente que todo objeto tem um protótipo. A função de construtor Foo também possui a sua própria
__proto__
, Function.prototype, e que, por sua vez, também faz referência, por sua__proto__
propriedade, novamente ao Object.prototype. Assim, repita, Foo.prototype é apenas uma propriedade explícita de Foo que se refere ao protótipo de objetos bec.
var b = new Foo(20);
var c = new Foo(30);
Quais são as diferenças entre __proto__
e prototype
?
A figura foi retirada de dmitrysoshnikov.com .
__proto__
diferenteconstructor.prototype
?Respostas:
__proto__
é o objeto real usado na cadeia de pesquisa para resolver métodos etc.prototype
é o objeto usado para criar__proto__
quando você cria um objeto comnew
:fonte
prototype
não está disponível nas próprias instâncias (ou outros objetos), mas apenas nas funções do construtor.prototype
só está disponível em funções, uma vez que são derivadasFunction
,Function
e,Object
mas em qualquer outra coisa que não é. No entanto,__proto__
está disponível em qualquer lugar.__proto__
é o objeto real que é salvo e usado como protótipo, enquantoMyconstructure.prototype
é apenas um plano para o__proto__
qual está representado o objeto real salvo e usado como protótipo. Portanto,myobject.prototype
não seria uma propriedade do objeto real, porque é apenas uma coisa temporária usada pela função construtora para descrever comomyobject.__proto__
deve ser.__proto__
propriedade de um objeto é um ponteiro para aprototype
propriedade da função construtora do objeto ? ie foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ISCar.prototype
, não é uma instância deCar.prototype
. EnquantoCar.protoype
IS é uma instância de umobject
.Car.prototype
não é algo que fornecenewCar
propriedades ou estrutura; simplesmente é o próximoobject
nanewCar
cadeia de protótipos.Car.prototype
não é temporárioobject
. Éobject
o valor definido como o valor da__proto__
propriedade de qualquer novoobject
s feito usandoCar
como aconstructor
. Se você quiser pensar em algo como um planoobject
, penseCar
em um plano para carros novosobject
.prototype
é uma propriedade de um objeto Function. É o protótipo de objetos construídos por essa função.__proto__
é propriedade interna de um objeto, apontando para seu protótipo. Os padrões atuais fornecem umObject.getPrototypeOf(O)
método equivalente , embora o padrão de fato__proto__
seja mais rápido.Você pode encontrar
instanceof
relacionamentos comparando uma funçãoprototype
com a__proto__
cadeia de um objeto e pode quebrá-los alterandoprototype
.Aqui
Point
está uma função construtora, ela cria um objeto (estrutura de dados) processualmente.myPoint
é um objeto construído porPoint()
assimPoint.prototype
fica guardado paramyPoint.__proto__
naquele momento.fonte
__proto__
propriedade de um objeto, ele mudará o objeto no qual as pesquisas de protótipo são feitas. Por exemplo, você pode adicionar um objeto de métodos como uma função__proto__
para ter um tipo de objeto de instância que pode ser chamado.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call não é uma função. Eu fizobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
A propriedade prototype é criada quando uma função é declarada.
Por exemplo:
Person.prototype
A propriedade é criada internamente quando você declara a função acima. Muitas propriedades podem ser adicionadas ao Person.prototype que são compartilhadas por instâncias de Person criadas usando new Person ().Vale a pena notar que
Person.prototype
é umObject
por padrão, literal (pode ser alterado conforme necessário).Toda instância criada usando
new Person()
possui uma__proto__
propriedade que aponta para oPerson.prototype
. Essa é a cadeia usada para percorrer para encontrar uma propriedade de um objeto específico.cria 2 instâncias de
Person
, esses 2 objetos podem chamar oage
método dePerson.prototype
comoperson1.age
,person2.age
.Na figura acima da sua pergunta, você pode ver que
Foo
é umFunction Object
e, portanto, ele possui um__proto__
link para oFunction.prototype
qual, por sua vez, é uma instânciaObject
e possui um__proto__
link paraObject.prototype
. O link proto termina aqui com__proto__
oObject.prototype
apontar paranull
.Qualquer objeto pode ter acesso a todas as propriedades em sua cadeia de proto, conforme vinculado por
__proto__
de protótipos, , formando a base para a herança prototípica.__proto__
não é uma maneira padrão de acessar a cadeia de protótipos, a abordagem padrão, mas similar, é usarObject.getPrototypeOf(obj)
.Código abaixo para
instanceof
operador fornece uma melhor compreensão:O
instanceof
operador de classe de objeto retornatrue
quando um objeto é uma instância de uma classe, mais especificamente seClass.prototype
for encontrado na cadeia proto desse objeto, o objeto é uma instância dessa classe.O método acima pode ser chamado como:
instanceOf.call(object, Class)
que retorna true se o objeto for uma instância da Class.fonte
prototype
objeto foi criado internamente em primeiro lugar? Alguém poderia simplesmente atribuir métodos estáticos ao próprio objeto de função. por exemplofunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? Por que não foi escolhido esse caminho ao adicionar os métodos aoprototype
objeto? Isso funcionará sef.__proto__ = g
onde g for a classe base.prototype
objeto tenha sido escolhido para compartilhamento porque apenas as propriedades exclusivas do construtor da função podem ser armazenadas no objeto do construtor da função.instanceof
resultaria em({}) instanceof Function === true
como não haveria maneira de diferenciar entre protótipos se aprototype
propriedade fosse removida.new
palavra-chave para criar uma instância, as propriedades e os métodos não seriam copiados sobre.Uma boa maneira de pensar nisso é ...
prototype
é usado porconstructor()
funções. Deveria realmente ter sido chamado de algo como,"prototypeToInstall"
, já que é isso que é.e
__proto__
é esse "protótipo instalado" em um objeto (que foi criado / instalado no objeto a partir da referidaconstructor()
função)fonte
constructor()
funções" para "funções construtoras", pois pode haver confusão com "__proto__.constructor()
funções". Considero isso importante, pois o construtor __proto __. Na verdade não é chamado quando umanew
palavra-chave é usada.Para explicar, vamos criar uma função
Quando o JavaScript executa esse código, ele adiciona
prototype
propriedade aa
,prototype
property é um objeto com duas propriedades:constructor
__proto__
Então, quando fazemos
a.prototype
retornaAgora, como você pode ver,
constructor
nada mais é do que aa
própria função e__proto__
aponta para o nível raizObject
do JavaScript.Vamos ver o que acontece quando usamos a
a
função comnew
palavra-chave.Quando o JavaScript executa esse código, ele faz 4 coisas:
__proto__
emb
e torna apontam paraa.prototype
assimb.__proto__ === a.prototype
a.prototype.constructor
(que é a definição da funçãoa
) com o objeto recém-criado (criado na etapa 1) como seu contexto (isto), portanto, aname
propriedade transmitida como 'JavaScript' (adicionada athis
) é adicionada ao objeto recém-criado.b
seja atribuído ao objeto recém-criado.Agora, se adicionarmos
a.prototype.car = "BMW"
e fizermosb.car
, a saída "BMW" será exibida.isso ocorre porque, quando o JavaScript executou esse código, ele procurou por
car
propriedadesb
, ele não encontrou o JavaScript usadob.__proto__
(que foi feito para apontar para 'a.prototype' na etapa 2) e encontra acar
propriedade, então retorne "BMW".fonte
constructor
não retornaa()
! Retornaa
. 2.__proto__
retornaObject.prototype
, não o objeto raiz em Javascript.Protótipo VS. __proto__ VS. [[Protótipo]]
Ao criar uma função, um objeto de propriedade chamado prototype está sendo criado automaticamente (você não a criou por si mesmo) e está sendo anexado ao objeto da função (the
constructor
).Nota : Este novo protótipo objeto de também aponta para, ou possui um link interno-privado, para o Objeto JavaScript nativo.
Exemplo:
Se você criar um novo objeto
Foo
usando anew
palavra - chave, estará basicamente criando (entre outras coisas) um novo objeto que possui um link interno ou privado aoFoo
protótipo da função que discutimos anteriormente:A ligação privada ao objeto dessa função chamada protótipo de colchetes duplos ou apenas
[[Prototype]]
. Muitos navegadores estão nos fornecendo um vínculo público chamado__proto__
!Para ser mais específico,
__proto__
é na verdade uma função getter que pertence ao objeto JavaScript nativo. Ele retorna a ligação de protótipo interno-privado de qualquer que seja athis
ligação (retorna a[[Prototype]]
deb
):Vale ressaltar que, a partir de
ECMAScript5
, você também pode usar o método getPrototypeOf para obter a ligação privada interna:NOTA: esta resposta não pretende cobrir todo o processo de criação de novos objetos ou novos construtores, mas para ajudar a compreender melhor o que é
__proto__
,prototype
e[[Prototype]]
e como ele funciona.fonte
Para deixar um pouco claro, além das ótimas respostas acima:
As instâncias têm __proto__ , as classes têm protótipo .
fonte
Em JavaScript, uma função pode ser usada como construtor. Isso significa que podemos criar objetos a partir deles usando a nova palavra-chave. Toda função de construtor vem com um objeto interno encadeado com eles. Este objeto interno é chamado de protótipo.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Primeiro, criamos um construtor:
function Foo(){}
. Para ser claro, Foo é apenas outra função. Mas podemos criar um objeto a partir dele com a nova palavra-chave. É por isso que chamamos de função construtoraToda função possui uma propriedade única, chamada propriedade prototype. Portanto, a função Constructor
Foo
possui uma propriedade prototype que aponta para seu protótipo, que éFoo.prototype
(veja a imagem).As funções de construtor são elas próprias uma função que é uma instância de um construtor de sistema chamado construtor [[Function]]. Então, podemos dizer que
function Foo
é construído por um construtor [[Function]]. Então,__proto__
do nossoFoo function
apontaremos para o protótipo de seu construtor, que éFunction.prototype
.Function.prototype
O próprio é nada mais que um objeto construído a partir de outro construtor de sistema chamado[[Object]]
. Então,[[Object]]
é o construtor deFunction.prototype
. Então, podemos dizer queFunction.prototype
é uma instância de[[Object]]
. Então,__proto__
deFunction.prototype
pontos paraObject.prototype
.Object.prototype
é o último homem da cadeia de protótipos. Quero dizer, não foi construído. Já está lá no sistema. Portanto,__proto__
aponta paranull
.Agora chegamos a instâncias de
Foo
. Quando criamos uma instância usandonew Foo()
, ele cria um novo objeto do qual é uma instânciaFoo
. Isso significa queFoo
é o construtor dessas instâncias. Aqui criamos duas instâncias (x e y).__proto__
de x e y, portanto, aponta paraFoo.prototype
.fonte
Resumo:
A
__proto__
propriedade de um objeto é uma propriedade que mapeia para aprototype
função construtora do objeto. Em outras palavras:instance.__proto__ === constructor.prototype // true
Isso é usado para formar a
prototype
cadeia de um objeto. Aprototype
cadeia é um mecanismo de pesquisa de propriedades em um objeto. Se a propriedade de um objeto for acessada, o JavaScript procurará primeiro o próprio objeto. Se a propriedade não for encontrada lá, ela subirá atéprotochain
até que seja encontrada (ou não)Exemplo:
Nosso primeiro log resulta
true
, porque, como mencionado, a__proto__
propriedade da instância criada pelo construtor se refere aoprototype
propriedade do construtor. Lembre-se, em JavaScript, funções também são objetos. Os objetos podem ter propriedades, e uma propriedade padrão de qualquer função é uma propriedade chamada prototype.Então, quando essa função é utilizada como uma função construtora, o objeto instanciado a partir dela receberá uma propriedade chamada
__proto__
. E essa__proto__
propriedade se refere àprototype
propriedade da função construtora (que por padrão todas as funções possuem).Por que isso é útil?
O JavaScript possui um mecanismo ao procurar propriedades nas
Objects
quais é chamada 'herança prototípica' , eis o que basicamente faz:__proto__
propriedade. Lá, ele verifica se a propriedade está disponível no objeto referido por__proto__
.__proto__
objeto, ela subirá a__proto__
cadeia, até oObject
objeto.prototype
cadeia, ele retornaráundefined
.Por exemplo:
fonte
Por acaso, estou aprendendo o protótipo de You Don't Know JS: this & Object Prototypes , que é um livro maravilhoso para entender o design abaixo e esclarecer muitos equívocos (é por isso que estou tentando evitar o uso de herança e coisas assim
instanceof
).Mas eu tenho a mesma pergunta que as pessoas fizeram aqui. Várias respostas são realmente úteis e esclarecedoras. Eu também adoraria compartilhar meus entendimentos.
O que é um protótipo?
Objetos em JavaScript têm uma propriedade interna, indicada na especificação como
[[Prototype]]
, que é simplesmente uma referência a outro objeto. Quase todos os objetos recebem um não-null
valor para essa propriedade, no momento de sua criação.Como obter o protótipo de um objeto?
via
__proto__
ouObject.getPrototypeOf
Qual é o
prototype
?prototype
é um objeto criado automaticamente como uma propriedade especial de uma função , usada para estabelecer a cadeia de delegação (herança), também conhecida como cadeia de protótipo.Quando criamos uma função
a
,prototype
é automaticamente criado como uma propriedade especial sobrea
e salva o código de função em que oconstructor
onprototype
.Eu adoraria considerar essa propriedade como o local para armazenar as propriedades (incluindo métodos) de um objeto de função. Essa também é a razão pela qual funções utilitárias em JS são definidas como
Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Por que enfatizar a propriedade de uma função ?
Assim,
Arary
,Function
,Object
estão todas as funções. Devo admitir que isso atualiza minha impressão em JS. Eu sei que funções são cidadãos de primeira classe em JS, mas parece que ele é construído sobre funções.Qual é a diferença entre
__proto__
eprototype
?__proto__
uma referência funciona em cada objeto para se referir à sua[[Prototype]]
propriedade.prototype
é um objeto criado automaticamente como uma propriedade especial de uma função , usada para armazenar as propriedades (incluindo métodos) de um objeto de função.Com esses dois, podemos mapear mentalmente a cadeia de protótipos. Como esta figura ilustra:
fonte
Em JavaScript, todo objeto (a função também é objeto!) Tem uma
__proto__
propriedade, a propriedade é referência ao seu protótipo.Quando usamos o
new
operador com um construtor para criar um novo objeto, a__proto__
propriedade do novo objeto será definida com aprototype
propriedade do construtor; o construtor será chamado pelo novo objeto, nesse processo "this" será uma referência ao novo objeto no escopo do construtor, finalmente retorne o novo objeto.O protótipo do construtor é
__proto__
propriedade, aprototype
propriedade do construtor é o trabalho com onew
operador.O construtor deve ser uma função, mas a função nem sempre é construtora, mesmo que tenha
prototype
propriedade.A cadeia de protótipos na verdade é
__proto__
propriedade do objeto para fazer referência ao seu protótipo, e a__proto__
propriedade do protótipo para fazer referência ao protótipo do protótipo e assim por diante, até fazer referência à__proto__
propriedade do protótipo do objeto que é referência a nulo.Por exemplo:
[[Prototype]]
e__proto__
propriedade é realmente a mesma coisa.Podemos usar o método getPrototypeOf do Object para obter o protótipo de algo.
Qualquer função que escrevemos pode ser usada para criar um objeto com o
new
operador, para que qualquer uma dessas funções possa ser um construtor.fonte
Outra boa maneira de entender isso:
Somente após o IE11
__proto__
ser suportado. Antes dessa versão, como o IE9, você poderia usar oconstructor
para obter o__proto__
.fonte
protótipo
prototype é uma propriedade de uma Function. É o modelo para criar objetos usando essa função (construtora) com a nova palavra-chave.
__proto__
é usado na cadeia de pesquisa para resolver métodos, propriedades. quando um objeto é criado (usando a função construtora com a nova palavra-chave),__proto__
é definido como (Construtor) Function.prototypeAqui está minha explicação (imaginária) para esclarecer a confusão:
Imagine que exista uma classe imaginária (blueprint / coockie cutter) associada à função. Essa classe imaginária é usada para instanciar objetos.
prototype
é o mecanismo de extensão (método de extensão em C # ou extensão rápida) para adicionar itens a essa classe imaginária.O acima pode ser imaginado como:
Assim,
Agora adicionando método ao
prototype
do Robot:O acima pode ser imaginado como extensão da classe Robot:
Que por sua vez,
fonte
__proto__
e protótipo. talvez protótipo e herança?prototype
e__proto__
ambos devem ser evitados. Temos aula agora e eu gosto de OOP.Simplificando:
Isso permite anexar propriedades ao X.prototype após a instanciação de objetos do tipo X, e eles ainda terão acesso a essas novas propriedades através da referência __proto__ que o mecanismo Javascript usa para percorrer a cadeia de protótipos.
fonte
Prototype ou Object.prototype é uma propriedade de um objeto literal. Ele representa o objeto de protótipo de objeto que você pode substituir para adicionar mais propriedades ou métodos ao longo da cadeia de protótipos.
__proto__ é uma propriedade do acessador (função get e set) que expõe o protótipo interno de um objeto através do qual ele é acessado.
Referências:
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
fonte
Object.prototype
não é uma propriedade de um objeto literal, tentando imprimir{}.prototype
retornos indefinidos; no entanto, pode ser acessado via{}.__proto__
, que retornaObject.prototype
.Eu sei, estou atrasado, mas deixe-me tentar simplificá-lo.
Digamos que existe uma função
A função Foo terá um objeto protótipo vinculado. Portanto, sempre que criamos uma função em JavaScript, ela sempre tem um objeto de protótipo vinculado a ela.
Agora vamos em frente e crie dois objetos usando a função Foo.
Agora, Foo.prototype, a. proto e b. proto tudo indica o mesmo objeto.
tudo acima retornaria verdadeiro.
Como sabemos, no JavaScript, as propriedades podem ser adicionadas dinamicamente. Podemos adicionar propriedade ao objeto
Como você vê, adicionamos o método Greet () no Foo.prototype, mas ele pode ser acessado em aeb ou em qualquer outro objeto construído usando Foo.
Ao executar a.Greet (), o JavaScript primeiro pesquisará Greet no objeto a na lista de propriedades. Ao não encontrar, ele subirá na cadeia proto de a. Desde um. proto e Foo.prototype é o mesmo objeto, o JavaScript encontrará o método Greet () e o executará.
Espero que agora protótipo e proto sejam um pouco simplificados.
fonte
Exemplo explicativo:
agora, myPupppie possui uma
__proto__
propriedade que aponta para Dog.prototype.mas myPuppie NÃO possui uma propriedade prototype.
Portanto,
__proto__
de mypuppie é a referência à propriedade .prototype da função construtora que foi usada para instanciar esse objeto (e o atual objeto myPuppie possui um "delegado para" o relacionamento com este__proto__
), enquanto a propriedade .prototype de myPuppie está simplesmente ausente (desde nós não o definimos).Boa explicação por MPJ aqui: proto vs prototype - Criação de Objetos em JavaScript
fonte
Fiz para mim um pequeno desenho que representa o seguinte trecho de código:
Eu tenho um histórico clássico de OO, portanto, foi útil representar a hierarquia dessa maneira. Para ajudá-lo a ler este diagrama, trate os retângulos na imagem como objetos JavaScript. E sim, funções também são objetos. ;)
Objetos em JavaScript têm propriedades e
__proto__
é apenas um deles.A idéia por trás dessa propriedade é apontar para o objeto ancestral na hierarquia (herança).
O objeto raiz no JavaScript é
Object.prototype
e todos os outros objetos são descendentes deste. A__proto__
propriedade do objeto raiz énull
, que representa o fim da cadeia de herança.Você notará que isso
prototype
é uma propriedade das funções.Cat
é uma função, mas tambémFunction
eObject
são funções (nativas).tom
não é uma função, portanto, não possui essa propriedade.A idéia por trás dessa propriedade é apontar para um objeto que será usado na construção, ou seja, quando você chama o
new
operador nessa função.De fato, quando criamos o
tom
objeto comnew Cat()
, o objeto criado terá a__proto__
propriedade definida como oprototype
objeto da função construtora.No final, vamos brincar um pouco com esse diagrama. As seguintes afirmações são verdadeiras:
tom.__proto__
A propriedade aponta para o mesmo objeto queCat.prototype
.Cat.__proto__
aponta para oFunction.prototype
objeto, comoFunction.__proto__
eObject.__proto__
faz.Cat.prototype.__proto__
etom.__proto__.__proto__
aponte para o mesmo objeto e é issoObject.prototype
.Felicidades!
fonte
tom.__proto__
eCat.prototype
são estritamente iguais, Então,tom.__proto__ === Cat.prototype
eCat.prototype === tom.__proto__
são verdadeiras. Então, o que você quis dizer com seta na imagem?prototype
acontece com a propriedade doCat
objeto (da sua pergunta).DEFINIÇÕES
(número entre parênteses () é um 'link' para o código que está escrito abaixo)
prototype
- um objeto que consiste em:=> funções (3) deste particular
ConstructorFunction.prototype
(5) acessíveis por cada objeto (4) criado ou a ser criado através dessa função construtora (1)=> a própria função construtora (1) )
=>
__proto__
deste objeto em particular (objeto de protótipo)__proto__
(dandor proto?) - um link ENTRE qualquer objeto (2) criado por meio de uma função específica do construtor (1) E as propriedades do objeto de protótipo (5) desse construtor que permitem que cada objeto criado (2) tenha acesso às funções do protótipo e métodos (4) (__proto__
por padrão, está incluído em todos os objetos em JS)ESCLARECIMENTO DE CÓDIGO
1
2)
3)
4)
5)
fonte
Vou tentar uma explicação da quarta série:
As coisas são muito simples. A
prototype
é um exemplo de como algo deve ser construído. Assim:Sou um
function
e construo novos objetos semelhantes aos meusprototype
Eu sou um
object
e fui construído usando o meu__proto__
como exemploprova :
fonte
prototype
nem a__proto__
são usados a qualquer momento como um blueprint para criar qualquer objeto. Este é um mito introduzido pelaclass
sintaxe embaçada e seus antecessores. Como o post de resposta diz, ele é usado apenas para a cadeia de pesquisa e, no caso deprototype
se identificar, éconstructor
usadonew
(o que faz parte do mecanismo de fingir ser elegante que confunde muitos usuários, inclusive eu).Toda função que você cria tem uma propriedade chamada
prototype
e ela inicia sua vida como um objeto vazio. Esta propriedade é inútil até que você use essa função como função construtora, ou seja, com a palavra-chave 'new'.Isso geralmente é confundido com a
__proto__
propriedade de um objeto. Alguns podem ficar confusos e, exceto que aprototype
propriedade de um objeto pode obter o proto de um objeto. Mas este não é o caso.prototype
é usado para obter o__proto__
objeto criado a partir de um construtor de função.No exemplo acima:
Eu espero que faça sentido.
fonte
prototype
não é usado para criar o__proto__
objeto.__proto__
, quando acessado, apenas fornece uma referência aoprototype
objeto.Que tal usar
__proto__
para métodos estáticos?fonte
__proto__
VS.prototype
em JavaScript" ?Experimente este código para entender
fonte
Há apenas um objeto usado para encadeamento protípico. Obviamente, esse objeto tem um nome e um valor:
__proto__
é seu nome eprototype
é seu valor. Isso é tudo.para facilitar ainda mais a compreensão, veja o diagrama na parte superior deste post (diagrama de dmitry soshnikov), você nunca encontrará
__proto__
pontos para outra coisa senãoprototype
seu valor.A essência é a seguinte:
__proto__
é o nome que faz referência ao objeto prototípico eprototype
é o objeto prototípico real.É como dizer:
x
é o nome do objeto (ponteiro) e{name: 'john'}
é o objeto real (valor dos dados).NOTA: esta é apenas uma dica massivamente simplificada de como eles estão relacionados em um nível alto.
Atualização: Aqui está um exemplo simples de javascript concreto para melhor ilustração:
Isso significa que, quando
Object.getPrototypeOf(x)
o valor real dex
(qual é o seu protótipo), é exatamente o que o__proto__
dex
está apontando. Portanto,__proto__
está de fato apontando para o protótipo dex
. Assim, faz__proto__
referênciax
(ponteiro dex
) eprototype
é o valor dex
(seu protótipo).Espero que esteja um pouco claro agora.
fonte
Essa é uma pergunta muito importante e relevante para quem deseja entender a herança prototípica. Pelo que entendi, o protótipo é atribuído por padrão quando um objeto é criado com o novo de uma função porque Function possui um objeto de protótipo por definição:
Quando criamos um objeto comum sem novo, ou seja, explicitamente a partir de uma função, ele não possui protótipo, mas possui um proto vazio ao qual pode ser atribuído um protótipo.
Podemos usar Object.create para vincular um objeto explicitamente.
fonte
__proto__
é a base para construirprototype
e uma função construtora, por exemplo:function human(){}
has,prototype
que é compartilhada via__proto__
na nova instância da função construtora. Uma leitura mais detalhada aquifonte
Como isso afirmou corretamente
Podemos observar ainda que a
__proto__
propriedade de um objeto criado usando o construtor de funções aponta para o local da memória apontado pelo protótipo propriedade desse respectivo construtor.Se alterarmos o local da memória do protótipo da função construtora, o
__proto__
objeto derivado continuará apontando para o espaço de endereço original. Portanto, para disponibilizar propriedades comuns na cadeia de herança, sempre acrescente propriedades ao protótipo de função do construtor , em vez de reinicializá-lo (o que alteraria seu endereço de memória).Considere o seguinte exemplo:
fonte
meu entendimento é: __proto__ e prototype são todos servidos para a técnica de cadeia de protótipos. a diferença é que funções nomeadas com sublinhado (como __proto__) não são direcionadas a desenvolvedores chamados explicitamente. em outras palavras, eles são apenas para alguns mecanismos, como herdar etc. são 'back-end'. mas funções nomeadas sem sublinhado são projetadas para serem chamadas explicitamente, elas são 'front-end'.
fonte
__proto__
eprototype
, do que apenas a convenção de nomenclatura. Eles podem ou não apontar para o mesmo objeto. Consulte a resposta @zyklus.!!! ESTA É A MELHOR EXPLICAÇÃO DO MUNDO !!!!!
no mecanismo javascript dos construtores de funções chama isso
q.__proto__ = prototype
automaticamente quando escrevemosnew Class
e no__proto__
conjunto de propsClass.prototype
Desfrutar %)
fonte