Passando i parametri a una funzione prototipata in JavaScript
-
06-07-2019 - |
Domanda
Di recente ho sperimentato la prototipazione in JavaScript e non riesco a capire perché il seguente codice non funziona. Quello che vorrei fare è creare una nuova istanza di formaggio con il parametro n.
function food(n) {
this.n=n;
}
function cheese(n) {
alert(this.n);
}
cheese.prototype=new food;
new cheese('paramesian');
Soluzione
Stai creando una nuova istanza Cheese
e l'argomento n
non viene mai utilizzato o assegnato alla variabile di istanza Cheese
.n
, perché quella logica è utilizzata solo dal costruttore Food
.
Puoi fare un paio di cose:
1. Applica il costruttore Food
all'interno la funzione Cheese
, usando l'oggetto argomenti
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. Ripeti la logica del costruttore Food
( this.n = n
) sulla funzione del costruttore Cheese
:
function Food(n) {
this.n=n;
}
function Cheese(n) {
this.n = n;
alert(this.n);
}
Cheese.prototype = new Food();
new Cheese('paramesian');
3. Usa un'altra tecnica, come costruttori di potenza :
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, eredità prototipale :
// 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'
Altri suggerimenti
Sembra che tu voglia solo capire come funziona il concatenamento di prototipi in JavaScript. Quello che segue è un tutorial eccellente, semplice e ben spiegato http://www.herongyang.com/JavaScript/Inheritance- da-Constructor-Prototipo-Object.html
Modifica , apparentemente non si tratta di eredità prototipica (vedi commenti), ma sembra funzionare 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');