Qual è il punto del metodo prototipo?


10

Sto leggendo Javascript: The Good Parts e ho faticato a orientarmi nella sezione sui prototipi .

Dopo un po 'di Google, sono giunto alla conclusione che è necessario aggiungere proprietà agli oggetti dopo la dichiarazione degli oggetti.

Usando questo script luccicava da w3schools, notai che rimuovere la linea aggiungendo la proprietà prototipo non aveva effetto . Quindi qual è il punto?


//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 ha detto bene, ma suggerisce anche una sostituzione, ad esempio documenti MDN: developer.mozilla.org/en/JavaScript
StuperUser

Risposte:


13

Non è così che funziona il prototipo. Il prototipo viene utilizzato nella catena di prototipi.

Ogni volta che si tenta di ottenere una proprietà su un oggetto, questo controllerà l'oggetto per quel nome di proprietà. Se non esiste, verrà visualizzato nel prototipo.

Esempio:

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"

Quindi il punto del prototipo è semplicemente il riutilizzo e l'ereditarietà del codice.


Okay, ora capisco questo. Ma ho provato ad aggiungere una proprietà in modo dinamico, e mi sta dicendo prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz,

3
@MildFuzz oè un oggetto. La .prototypeproprietà viene utilizzata per le funzioni, ignorala. Basta fareo.newProp = "mutts nuts"
Raynos,

7

Quando l'hai fatto fred.salary=20000hai aggiunto l'attributo salario solo a fred. Quando si utilizza il prototipo, tutti i dipendenti che verranno creati da quel momento in poi avranno l'attributo salariale.

Supponi di avere 100 istanze di dipendenti e di voler aggiungere un attributo salariale a tutti loro. Potresti farlo manualmente, scorrere su ogni dipendente e aggiungerlo. Oppure potresti usare il prototipo e impostare se per tutti loro.

Il prototipo è utile quando si desidera funzionalità per qualcosa che esiste già. Supponi di voler aggiungere un metodo personalizzato agli array. Faresti qualcosa del tipo:

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

Da quel momento in poi, tutti gli array che creerai avranno quel metodo disponibile.


3
Sono sorpreso che nessuno abbia menzionato che questo è progettato per contenere l'uso della memoria. Se devi implementare un oggetto complesso che ha molto codice, non vuoi che il codice venga ripetuto in ogni istanza dell'oggetto. Ovviamente, le proprietà dei dati hanno maggiori probabilità di essere diverse in ciascuna istanza, ma di solito si desidera solo una copia del codice, quindi lo si inserisce nel prototipo.
Dominic Cronin,

1
IMO questa è di gran lunga la risposta migliore.
The Muffin Man,

5

Potresti dare un'occhiata a questo articolo .

Un linguaggio basato su prototipo ha la nozione di oggetto prototipico, un oggetto usato come modello da cui ottenere le proprietà iniziali per un nuovo oggetto. Qualsiasi oggetto può specificare le proprie proprietà, sia quando lo si crea che in fase di esecuzione. Inoltre, qualsiasi oggetto può essere associato come prototipo per un altro oggetto, consentendo al secondo oggetto di condividere le proprietà del primo oggetto.

Se si aggiunge una proprietà a un oggetto utilizzato come prototipo per un set di oggetti, anche gli oggetti per cui è il prototipo ottengono la nuova proprietà.

Questo è uno dei principali vantaggi di un linguaggio basato sui prototipi rispetto a quelli basati sulle classi.

Inoltre, è facile ottenere un'eredità OO classica con JS se necessario, ma spesso è difficile ottenere un modello prototipo per un linguaggio che non lo implementa per impostazione predefinita.


3
+1 per l'articolo sulle lingue basato sulla classe e sul prototipo
adivasile,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.