2017-06-06 3 views
0

Ich versuche, Polymorphismus durch ES6 Klassen zu emulieren, um in der Lage zu sein, diese Theorie besser zu verstehen.ES6 Klassen Fähigkeit, Polymorphie durchzuführen

Das Konzept ist klar (Entwerfen von Objekten, um Verhaltensweisen zu teilen und gemeinsame Verhaltensweisen mit bestimmten zu überschreiben), aber ich fürchte, mein Code oben ist kein gültiges Polymorphie-Beispiel.

Aufgrund meines Mangels an Erfahrung, ich schätze, wenn Sie diese Fragen in umfassenden Weise zu beantworten:

  • Die Tatsache, dass beide Klassen haben einen ebenso Methode mit dem Namen, und das aus jeder Klasse gemacht Instanzen Zugriff korrekt erhalten zu ihren jeweiligen Methoden macht dies ein polymorphes Beispiel?
  • Falls Polimorphismus nicht emuliert wird, welche Änderungen sollten im Code dafür vorgenommen werden?
  • Ich habe versucht, die Employee.prototype = new Person(); Zeile zu entfernen, und es funktioniert immer noch. Deshalb habe ich Angst, dass ich dieses Konzept nicht verstehe.

class Person { 
 
     constructor (name, age) { 
 
      this._name = name; 
 
      this._age = age; 
 
     } 
 
     } 
 

 
     Person.prototype.showInfo = function(){ 
 
     return "Im " + this._name + ", aged " + this._age; 
 
     }; 
 

 

 
     class Employee { 
 
     constructor (name, age, sex) { 
 
      this._name = name; 
 
      this._age = age; 
 
      this._sex = sex; 
 
     } 
 
     } 
 

 
     Employee.prototype = new Person(); 
 

 
     Employee.prototype.showInfo = function(){ 
 
     return "Im " + this._sex + ", named " + this._name + ", aged " + this._age; 
 
     }; 
 

 

 
     var myPerson = new Person('Jon', 20); 
 
     var myEmployee = new Employee('Doe', 10, 'men'); 
 

 
     document.write(myPerson.showInfo() + "<br><br>"); // Im Jon, aged 20 
 
     document.write(myEmployee.showInfo() + "<br><br>"); // Im men, named Doe, aged 10

+0

'Employee.prototype = new Person()' sollte nicht mit ES6 verwendet werden. Es ist in etwa eine Sache, die "erweitert" mehr oder weniger tut. Wenn Sie daran interessiert sind, wie JS prototypische Vererbung funktioniert, würde ich vorschlagen, mit ES5 zu beginnen, da ES6-Klassen syntaktischer Zucker für vorhandene ES5-Vererbungsrezepte sind. – estus

+0

Subtyp Polymorphismus ist eine Sackgasse. Schauen Sie stattdessen in den parametrischen/Ad-hoc-Polymorphismus. – ftor

Antwort

5

Jedes JavaScript-Objekt verfügt über eine interne "Prototyp" Eigenschaft, oft [[Prototyp]], die auf das Objekt verweist, aus dem direkt erbt es.

Jede JavaScript-Funktion [Objekt] hat einen Eigenschaftsprototyp, der mit einem [fast] leeren Objekt initialisiert wird. Wenn Sie eine neue Instanz dieser Funktion erstellen, indem Sie sie als Konstruktor aufrufen, zeigt der [[Prototyp]] dieses neuen Objekts auf das Prototypobjekt des Konstruktors.

Also, wenn Sie dieses var myPerson = new Person('Jon', 20); schreiben, haben Sie die Methode show, weil Sie diese

haben
Person.prototype.showInfo = function(){ 
     return "Im " + this._name + ", aged " + this._age; 
     }; 

Mit ES6, wenn Sie den Polymorphismus sehen wollen Sie das tun könnte:

class Person { 
 
     constructor (name, age) { 
 
      this._name = name; 
 
      this._age = age; 
 
     } 
 
     
 
     showInfo() { 
 
     \t return "Im " + this._name + ", aged " + this._age; 
 
     } 
 
} 
 

 
class Employee extends Person{ 
 
     constructor (name, age, sex) { 
 
      super(name,age); 
 
      this._sex = sex; 
 
     } 
 
     
 
     showInfo(){ 
 
     \t return "Im " + this._sex + ", named " + this._name + ", aged " + this._age; 
 
     } 
 
    } 
 

 
    var myPerson = new Person('Jon', 20); 
 
    var myEmployee = new Employee('Doe', 10, 'men'); 
 

 
    document.write(myPerson.showInfo() + "<br><br>"); // Im Jon, aged 20 
 
    document.write(myEmployee.showInfo() + "<br><br>"); // Im men, named Doe, aged 10

+0

Konnte nicht klarer sein. Vielen Dank sincerelly – Biomehanika

3

Sie mischen ES5 und ES6. Außerdem haben Sie einfach zwei Klassen erstellt. Employee erbt nicht wirklich von Person. Der Code, den Sie sollte wie folgt aussehen wollen:

class Person { 
 
    constructor(name, age) { 
 
     this._name = name; 
 
     this._age = age; 
 
    } 
 

 
    showInfo() { 
 
     return `I'm ${this._name}, aged ${this._age}.`; 
 
    } 
 
} 
 

 
class Employee extends Person { 
 
    constructor(name, age, sex) { 
 
     super(name, age); 
 
     this._sex = sex; 
 
    } 
 

 
    showInfo() { 
 
     return `I'm a ${this._sex} named ${this._name}, aged ${this._age}.`; 
 
    } 
 
} 
 

 
const alice = new Person("Alice", 20); 
 
const bob = new Employee("Bob", 25, "male"); 
 

 
console.log(alice.showInfo()); 
 
console.log(bob.showInfo());

So, hier ist eine kurze Zusammenfassung dessen, was sich verändert hat.

Zunächst einmal, keine Notwendigkeit, eine mehr zuweisen. Stattdessen extend die übergeordnete Klasse zum Erstellen einer untergeordneten Klasse. Sie können den übergeordneten Konstruktor über den Aufruf super() im untergeordneten Konstruktor aufrufen. Dadurch werden die Eigenschaften festgelegt, die vom übergeordneten ctor gehandhabt werden. Beachten Sie, dass wir name oder age nicht mehr im Child-Center setzen! Deshalb funktioniert Ihr Beispiel auch nach dem Entfernen der Zeile, die den untergeordneten Prototyp festgelegt hat: Sie legen die Eigenschaften trotzdem manuell fest.

Methoden werden innerhalb der Klasse definiert; Keine Notwendigkeit, die prototype zu verwenden. Sie überschreiben die Methode in der Kindklasse, indem Sie sie dort deklarieren.

Sollten Sie weitere Erläuterungen benötigen, fragen Sie bitte im Kommentar.

+0

Ich bin sehr dankbar, es ist jetzt ganz klar. Ich sollte die andere Antwort als gültig markieren und wurde vorher gepostet. Vielen Dank für Ihre Hilfe. – Biomehanika