2009-11-29 15 views
5

Ich habe vor kurzem experimentiert mit Prototyping in Javascript und ich kann nicht herausfinden, warum der folgende Code nicht funktioniert. Was ich tun möchte, ist eine neue Instanz von Käse mit Parameter n zu erstellen.Übergabe von Parametern an eine prototyped Funktion in Javascript

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

Antwort

8

Sie erstellen eine neue Cheese Instanz, und das Argument n nie verwendet wird oder das auf den Cheese Instanzvariable this.n, da diese Logik nur auf dem Food Konstruktor verwendet wird.

Sie können ein paar Dinge tun:

1. Apply Der Food Konstruktor innerhalb der Cheese Funktion, mit dem arguments Objekt und dem neu erstellten Kontext (this).

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

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

new Cheese('paramesian'); 

2. Wiederholen Sie die Food Konstruktor Logik (this.n = n) auf der Cheese -Konstruktorfunktion:

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

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

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

3. Verwenden Sie eine andere Technik, wie 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. Eine weitere Option, 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

Ich mag # 3, aber Sie müssen das "neue" vor "Essen (n)" entfernen. – Magnar

+0

@Magnar, ja war ein Tippfehler, behoben, keine "diese" oder "neue" verwendet ... – CMS

+0

Danke für die informative Antwort. Option Nummer 1 scheint für jetzt die beste Wahl zu sein, zumindest bis man # 3 vollständig versteht. – Kenneth

-1

bearbeiten, Dies ist offenbar nicht prototypische Vererbung (siehe Kommentare), aber es scheint für diesen besonderen Zweck zu arbeiten.

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

    alert(this.n); 
} 

new cheese('paramesian'); 
+0

Warum die unten Abstimmung? Dies ist eine vollkommen gültige Methode ... – Atli

+1

Sie haben den Downvote von mir bekommen, denn so funktioniert die prototypische Vererbung nicht in JavaScriupt. Du hättest genauso gut sagen können: this.anything = food; this.anything (n) 'und du hättest immer noch die richtige Warnung erhalten. Aber "Käse" ist mit diesem Code keineswegs in die Prototypkette eingegangen. –

+0

Ich habe Sie nicht downvoted, aber das 'Prototyp' - Objekt, das für ** Konstruktorfunktionen ** verwendet werden soll, nicht für Objektinstanzen (wie 'das' ist), Ihr Beispiel funktioniert, wenn Sie' this.prototype (n); ', du führst' food' im Kontext des neuen 'cheese'-Objekts ('this') genau wie im ersten Beispiel, das ich gepostet habe, versuche das' prototype' Keyword in deinem Beispiel für 'foobar' und dich zu ändern Ich werde sehen, dass es auch funktioniert, es hat nichts mit der Prototypkette zu tun ... – CMS

Verwandte Themen