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');
È stato utile?

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');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top