Qual è il punto del metodo prototipo?

10

Sto leggendo attraverso Javascript: The Good Parts , e ho faticato a mettere la testa sulla sezione su prototypes .

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

Usando questo script brillava da w3schools, ho notato che rimuovere la riga aggiungendo la proprietà prototype aveva nessun effetto . Allora, 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);

    
posta Mild Fuzz 06.09.2011 - 15:08
fonte

3 risposte

13

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

Ogni volta che provi a ottenere una proprietà su un oggetto, controllerà l'oggetto per quel nome di proprietà. Se non esiste cercherà 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.

    
risposta data 06.09.2011 - 15:20
fonte
7

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

Supponiamo di avere 100 istanze di dipendenti e di voler aggiungere un attributo di stipendio a tutti loro. Puoi farlo manualmente, iterare su ogni dipendente e aggiungerlo. Oppure potresti usare il prototipo e impostare se per tutti loro.

Prototype è utile quando vuoi funzionalità a qualcosa che già esiste. Supponi di voler aggiungere un metodo personalizzato agli array. Faresti qualcosa come:

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

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

    
risposta data 06.09.2011 - 15:22
fonte
5

Potresti dare un'occhiata a questo articolo .

A prototype-based language has the notion of a prototypical object, an object used as a template from which to get the initial properties for a new object. Any object can specify its own properties, either when you create it or at run time. In addition, any object can be associated as the prototype for another object, allowing the second object to share the first object's properties.

Se aggiungi una proprietà a un oggetto che viene utilizzato come prototipo per un insieme di oggetti, anche gli oggetti per i quali è il prototipo ottengono la nuova proprietà.

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

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

    
risposta data 06.09.2011 - 15:43
fonte

Leggi altre domande sui tag