2009-11-29 22 views
5

Recentemente ho sperimentato la prototipazione in javascript e non riesco a capire perché il codice seguente non funzioni. Quello che mi piacerebbe fare è creare una nuova istanza di formaggio con il parametro n.Passaggio di parametri a una funzione prototipata in javascript

function food(n) { 
    this.n=n; 
} 
function cheese(n) { 
    alert(this.n); 
} 
cheese.prototype=new food; 
new cheese('paramesian'); 

risposta

8

Si sta creando una nuova Cheese esempio, e l'argomento n non viene mai usata o assegnato alla variabile Cheese esempio this.n, perché la logica che viene utilizzato solo sul costruttore Food.

Si può fare un paio di cose:

1. Apply il costruttore Food all'interno della funzione Cheese, utilizzando l'oggetto arguments e il contesto appena creato (this).

function Food(n) { 
    this.n=n; 
} 

function Cheese(n) { 
    Food.apply (this, arguments); 
    alert(this.n); 
} 

new Cheese('paramesian'); 

2. Ripetere la logica Food costruttore (this.n = n) sulla funzione Cheese costruzione:

function Food(n) { 
    this.n=n; 
} 

function Cheese(n) { 
    this.n = n; 
    alert(this.n); 
} 

Cheese.prototype = new Food(); 
new Cheese('paramesian'); 

3. Utilizzare un'altra tecnica, come power constructors:

function food (n) { 
    var instance = {}; 
    instance.n = n; 

    return instance; 
} 


function cheese (n) { 
    var instance = food(n); 
    alert(instance.n); 

    return instance; 
} 

cheese('parmesian'); 
cheese('gouda'); 

4. Ancora un'altra opzione, prototypal inheritance:

// helper function 
if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
    }; 
} 

var food = { 
    n: "base food", 
    showName : function() { alert(this.n); } 
}; 

var cheese1 = Object.create(food); 
cheese1.n = 'parmesian'; 
cheese1.showName(); // method exists only in 'food' 
+0

Mi piace # 3, ma devi rimuovere il 'nuovo' davanti a 'cibo (n)'. – Magnar

+0

@Magnar, sì era un errore di battitura, fisso, non 'questo' o' nuovo' usato ... – CMS

+0

Grazie per la risposta informativa. L'opzione numero 1 sembra essere la scelta migliore per ora, almeno fino a quando non si comprenderà pienamente il punto # 3. – Kenneth

-1

Modifica, questo non è a quanto pare l'ereditarietà prototipo (vedi commenti), ma sembra di lavorare per questo scopo particolare.

function food(n) { 
    this.n=n; 
} 
function cheese(n) { 
    this.prototype = food; 
    this.prototype(n); 

    alert(this.n); 
} 

new cheese('paramesian'); 
+0

Perché il voto negativo? Questo è un metodo perfettamente valido ... – Atli

+1

Hai ottenuto il downvote da me perché non è così che l'ereditarietà prototipica funziona in JavaScriupt. Avresti potuto dire altrettanto bene: this.anything = food; this.anything (n) 'e avresti comunque ricevuto l'avviso corretto. Ma "formaggio" non è mai entrato nella catena del prototipo con quel codice. –

+0

Non l'ho downvoted, ma l'oggetto 'prototype' doveva essere usato su ** funzioni di costruzione ** non su istanze di oggetto (come' this' is), il tuo esempio funziona perché quando chiami 'this.prototype (n), 'stai eseguendo' food' nel contesto del nuovo oggetto "cheese" ('this') proprio come il primo esempio che ho postato, prova a cambiare la parola chiave' prototype' nel tuo esempio per 'foobar' e tu vedrò che funziona anche, non ha niente a che fare con la catena del prototipo ... – CMS

Problemi correlati