2016-10-29 5 views
0

Versuch inheritnace in Javascript und total verwirrtWie erben Sie anonyme JavaScript-Funktionen, die Variablen zugewiesen sind?

ich nur verstehen müssen, dass Dogcat bark und meow Funktion haben und in der Lage this (irgendwie) jedes Objekt in Vererbungskette zuzugreifen:

var cat = function() { this.name = "tom"; this.cat_instance = this; } 
    var dog = function() { this.name = "bob"; this.dog_instance = this; console.log("cat is here!");} 

    cat.prototype.meow = function() { console.log("mhew"); } 
    dog.prototype.bark = function() { console.log("whoof"); } 

    var DogCat = function() { 
     DogCat.prototype = dog.prototype; 
     DogCat.constructor = cat; 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

So DogCat.prototype jetzt (sollte?) zeigen Sie auf dog Prototyp und in der Instanz von DogCat Ich sollte mindestens bark Funktion erhalten, aber Instanz hat diese Funktion nicht.

Okay, das ist ein Chaos (in meinem Kopf), versuche ich bin jetzt gelten beide geerbt Bauer zu einem Kind:

var DogCat = function() { 
     cat.apply(this); 
     dog.apply(this); 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

Dann einen Prototyp zu einem Hund zeigen:

DogCat.prototype = dog.prototype; 
    var d = new DogCat(); 
    > cat is here! 
    >my name is [object Object] [object Object] 

Jetzt Ich kann auf die bark zugreifen, aber wie mit meow Funktion umgehen? Wie baut man eine Prototypkette richtig?

UPD

leider in DogCat sollte es DogCat.prototype = dog.prototype,

festen
+1

Die erste Regel der Prototypen lautet: [Weisen Sie ihnen niemals im Konstruktor zu] (http://stackoverflow.com/q/21296559/1048572). Die zweite Regel von JS-Prototypen lautet: Es gibt keine [Mehrfachvererbung] (https://en.wikipedia.org/wiki/Multiple_inheritance). Es tut uns leid. – Bergi

+0

Vielen Dank für das Löschen! Aber wie erstellt man komplexe Anwendungen und vermeidet, wie man Code-Duplizierung vermeidet? einfach prototypische Eigenschaften wie 'DogCat.prototype.meow = cat.prototype.meow;'? –

+0

Ja, es gibt viel mehr Muster, um Code-Duplikation zu vermeiden als nur Vererbung. Welche davon am besten zu Ihrer Situation passt, hängt davon ab; Wenn Sie Ihren echten Code zeigen, können wir Ihnen etwas vorschlagen. – Bergi

Antwort

2

Sie sind meist auf dem richtigen Weg, aber einige Fehler haben.

Ihr erster Code wird nicht funktionieren, da Sie den Prototyp innerhalb des Konstruktors zuweisen, dh der Prototyp wird nach der Erstellung des Objekts zugewiesen. Das zuerst erstellte Objekt hätte nicht die Prototyp-Methoden, aber das zweite würde es geben. Auch Sie haben schon bemerkt, dass das Zuweisen der constructor nichts Gutes bringt. Sie müssen Konstruktoren manuell anwenden.

var DogCat = function() { 
    cat.apply(this); 
    dog.apply(this); 
    console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 
DogCat.prototype = dog.prototype; 

Prototypen sind auch nur normale Objekte. Keine magischen Eigenschaften. Sie können nicht zwei Prototypen zuweisen und erwarten, dass es magisch funktioniert. Wenn Sie von zwei Basisklassen erben möchten, können Sie eine inherit Funktion für Ihre Bequemlichkeit schreiben.

Oder weisen Sie manuell alle Methoden zu, die Sie von Basisklassen benötigen, wenn Sie wissen, was Sie erben.

DogCat.prototype.bark = dog.prototype.bark; 
DogCat.prototype.meow = cat.prototype.meow; 
+2

Sie sollten diese Funktion nicht als 'inheritFrom' bezeichnen. Stattdessen wäre 'copyPrototypeMethods' geeignet. Der Begriff "Vererbung" impliziert, dass (mit "d = new DogCat") "d instanceof Dog" und "d instanceof Cat" funktionieren würden, was nicht der Fall ist. – Bergi

Verwandte Themen