2009-04-15 10 views
7

javascript di apprendimento quando mi sono imbattuto nel concetto di prototipo. Sono riuscito ad aggiungere nuovi metodi alla classe cat ma non è riuscito a ignorare il metodo originale talk.Funzione prototipo JavaScript che non sovrascrive quella originale

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " : I'm a girl!") 
    } 
} 

cat.prototype.talk = function() { 
    alert(this.name + " : I'm a dude!") 
} 

cat1 = new cat("felix") 
cat1.talk() 

Perché non questo avviso il nuovo testo?

risposta

16

'function cat' è solo una funzione. Il suo prototipo è un oggetto vuoto ({}). "New cat" può essere chiamato per aggiungere "name" dei membri e "talk" a un nuovo oggetto. Sotto questo nuovo oggetto sarà il prototipo della funzione, che è ancora {}.

var c= new cat('Tiddles'); 

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: {} 

Ora, quando si scrive a 'cat.prototype.talk', si stanno aggiungendo i membri di tale oggetto sottostante:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

La funzione di 'parlare' situato direttamente sul istanza 'c' prende precedenza sul 'talk' impostato indirettamente sul prototipo del costruttore di c.

Quindi hai mixato due stili di ereditarietà qui, il metodo di assegnazione "this" e il metodo "prototype".

Scrivere metodi per prototipi ha il vantaggio che non si ottengono copie ridondanti degli stessi membri copiate in ogni istanza di oggetto; scrivere in istanze ha il vantaggio di risolvere il problema dei metodi associati. Quello che scegli dipende da te, ma non mescolare i due. Se vuoi seguire il percorso del prototipo, solo "nome" dovrebbe essere scritto su "questo", perché questa è l'unica proprietà specifica di ogni istanza.

7

la funzione allegata all'inizio è associata all'oggetto (1 funzione per ogni istanza). l'altro è collegato al prototipo (1 funzione condivisa da tutte le istanze).

i membri a livello di oggetto sostituiscono quelli a livello di prototipo.

Problemi correlati