2009-11-29 19 views
5

Recientemente he estado experimentando con prototipos en javascript y no pueden entender por qué el código siguiente no funciona. Lo que me gustaría hacer es crear una nueva instancia de queso con el parámetro n.pasar parámetros a una función prototipo en javascript

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

Respuesta

8

Usted está creando un nuevo Cheese ejemplo, y el argumento n no se utiliza nunca o asignado a la variable de instancia Cheesethis.n, debido a que la lógica sólo se utiliza en el Food constructor.

Puede hacer un par de cosas:

1. Apply la Food constructor dentro de la función Cheese, utilizando el objeto arguments y el contexto recién creado (this).

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

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

new Cheese('paramesian'); 

2. Repita la lógica Food constructor (this.n = n) en la función Cheese constructor:

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

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

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

3. Use otra técnica, como 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. Sin embargo, otra opción, 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

Me gusta el n. ° 3, pero debe quitar el 'nuevo' delante de 'food (n)'. – Magnar

+0

@Magnar, sí era un error tipográfico, fijo, no hay '' this' o utilizados new' ... – CMS

+0

Gracias por la respuesta informativa. La opción número 1 parece ser la mejor opción por ahora, al menos hasta que comprenda por completo el n. ° 3. – Kenneth

-1

Editar, esto no es aparentemente la herencia de prototipo (ver comentarios), pero parece que no funciona para este propósito en particular.

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

    alert(this.n); 
} 

new cheese('paramesian'); 
+0

Por qué el voto hacia abajo? Este es un método perfectamente válido ... – Atli

+1

Obtuviste mi voto negativo porque así no es como funciona la herencia prototípica en JavaScriupt. Podrías haber dicho 'esto. Cualquier cosa = comida; esto.cualquier cosa (n) 'y todavía tendrías la alerta correcta. Pero 'cheese' de ninguna manera entró en la cadena de prototipos con ese código. –

+0

que no te lo downvoted, pero el objeto 'prototype' destinado a ser utilizado en ** ** funciones constructoras no en instancias de objetos (como' this' es), el ejemplo funciona porque cuando se llama 'this.prototype (n); ', se está ejecutando' food' en el contexto del nuevo objeto "queso" ('this') al igual que el primer ejemplo que he publicado, intenta cambiar la palabra clave' prototype' en su ejemplo para 'foobar' y Veo que también funciona, no tiene nada que ver con la cadena de prototipos ... – CMS

Cuestiones relacionadas