Qual é o objetivo do método de protótipo?


10

Estou lendo o Javascript: The Good Parts e lutei para entender minha seção de protótipos .

Depois de um pouco do google, cheguei à conclusão de que é adicionar propriedades aos objetos após a declaração dos objetos.

Usando esse script brilhava em w3schools, notei que remover a linha que adiciona a propriedade prototype não teve efeito . Então qual é o ponto?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);


4
@Raynos bem dito, mas sugerem um substituto também, por exemplo, docs MDN: developer.mozilla.org/en/JavaScript
StuperUser

Respostas:


13

Não é assim que o protótipo funciona. O protótipo é usado na cadeia de protótipos.

Sempre que você tenta obter uma propriedade em um objeto, ele verifica o objeto para esse nome de propriedade. Se não existir, procurará no protótipo.

Exemplo:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Portanto, o objetivo do protótipo é simplesmente reutilização e herança de código.


Ok, então eu entendo isso agora. Mas eu tentei adicionar uma propriedade dinamicamente, e isso está me dizendo prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz

3
@MildFuzz oé um objeto. A .prototypepropriedade é usada em funções, ignore-a. Apenas façao.newProp = "mutts nuts"
Raynos

7

Quando você fred.salary=20000adicionou o atributo de salário apenas a fred. Ao usar o protótipo, todos os funcionários que você criar a partir de então terão o atributo salário.

Digamos que você tenha 100 instâncias de funcionários e queira adicionar um atributo de salário a todos eles. Você pode fazer isso manualmente, iterar sobre cada funcionário e adicioná-lo. Ou você pode usar prototype e definir se para todos eles.

O protótipo é útil quando você deseja funcionalidade para algo que já existe. Digamos que você queira adicionar um método personalizado às matrizes. Você faria algo como:

Array.prototype.my_custom_method = function() {...}

A partir daí, todas as matrizes que você criará terão esse método disponível.


3
Estou surpreso que ninguém tenha mencionado que isso foi projetado para manter o uso da memória baixo. Se você precisar implementar um objeto complexo com muito código, não deseja que o código seja repetido em todas as instâncias do objeto. Obviamente, é mais provável que as propriedades dos dados sejam diferentes em cada instância, mas geralmente você deseja apenas uma cópia do código e, portanto, coloca-o no protótipo.
Dominic Cronin

11
IMO, esta é a melhor resposta de longe.
The Muffin Man

5

Você pode dar uma olhada neste artigo .

Uma linguagem baseada em protótipo tem a noção de um objeto prototípico, um objeto usado como modelo para obter as propriedades iniciais de um novo objeto. Qualquer objeto pode especificar suas próprias propriedades, quando você o cria ou no tempo de execução. Além disso, qualquer objeto pode ser associado como o protótipo para outro objeto, permitindo que o segundo objeto compartilhe as propriedades do primeiro objeto.

Se você adicionar uma propriedade a um objeto usado como protótipo para um conjunto de objetos, os objetos para os quais é o protótipo também obterão a nova propriedade.

Essa é uma das principais vantagens de uma linguagem baseada em protótipo em relação à baseada em classe.

Além disso, é fácil obter uma herança OO clássica com JS, se necessário, mas geralmente é difícil obter um modelo de protótipo para uma linguagem que não a implementa por padrão.


3
+1 para baseada em classes vs. linguagens baseadas em protótipos artigo
adivasile
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.