Pergunta

Eu estive recentemente experimentando com protótipos em javascript e eu não consigo descobrir por que o seguinte código não funciona. O que eu gostaria de fazer é criar uma nova instância de queijo com parâmetro n.

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

Solução

Você está criando uma nova instância Cheese, eo n argumento nunca é usado ou atribuído à variável Cheese exemplo this.n, porque essa lógica é usada apenas no construtor Food.

Você pode fazer um par de coisas:

1. Aplicar o construtor Food dentro da função Cheese, utilizando o arguments objeto eo contexto recém-criado (this).

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

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

new Cheese('paramesian');

2. Repita a lógica construtor Food (this.n = n) na função de construtor Cheese:

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

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

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

3. Usar outra técnica, como poder construtores :

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. Outra opção, prototypal herança :

// 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'

Outras dicas

Parece que você só quer entender como protótipo encadeamento obras em JavaScript. O seguinte é um excelente, simples e bem explicado tutorial http://www.herongyang.com/JavaScript/Inheritance- de-Construtor-Prototype-Object.html

Editar , esta é, aparentemente, não herança prototípica (ver comentários), mas parece trabalho para este fim específico.

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

    alert(this.n);
}

new cheese('paramesian');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top