2012-07-26 8 views
5

Il codice seguente è quasi identico a un codice del superbo libro di Douglas Crockford, JavaScript: The Good Parts, da 29-30 pagine. L'unica differenza è che, aggiunge la proprietà get_status in questo modo:Codice di Crockford relativo al modello di invocazione del costruttore

Quo.prototype.get_status=function() { 
    this.status=string; 
} 

mia domanda è perché il suo codice viene eseguito male, ma il mio piccolo cambiamento, di seguito, i risultati in un errore che dice myQuo non ha un metodo get_status?

<script> 
    var Quo=function(string) { 
    this.status=string; 
    } 
    Quo.get_status=function() { 
    return this.status; 
    } 
    var myQuo=new Quo("confused"); 
    alert(myQuo.get_status()); 
</script> 

risposta

8

si sta aggiungendo il metodo per l'oggetto Quo funzione, non al suo prototipo, in modo da non essere ereditata da istanze create con new Quo(). Una funzione aggiunta in questo modo è un po 'come un metodo statico nei classici linguaggi OOP - può essere chiamata con Quo.get_status(), ma non verrà ereditata dalle istanze e this farà riferimento alla funzione Quo stessa.

Quo.status = "foo"; 
Quo.get_status(); // "foo" 
+1

La domanda è _why_stato_stato non è stato aggiunto a myQuo. So già che l'ho aggiunto a Quo, non al suo prototipo. –

+5

Le istanze non ereditano proprietà o metodi dei loro costruttori - solo le proprietà e i metodi associati al prototipo vengono ereditati. – nrabinowitz

0

Le funzioni sono oggetti in JavaScript. Quando si aggiungono le proprietà alle funzioni, esse non vengono ereditate dalle istanze di tale funzione. Tuttavia, quando aggiungi proprietà al prototipo della funzione, queste vengono ereditate. Per capire come l'ereditarietà basata su prototipi funziona in JavaScript, leggi following answer.