2017-06-19 2 views
0

Ich habe einige Aufgaben für meinen Job gemacht, ich habe alle von ihnen getan. Aber ich habe ein paar Probleme, es funktioniert nicht so wie es soll. Wenn ich versuche, einen neuen Benutzer für Customer-Klasse hinzufügen, zum Beispiel:Javascript/Erweiterte Klassen/Objekte

var user3 = new Customer ("Sergiu", "Tataru"); 

Und wenn ich user3 zuzugreifen, erhalte ich:

lastname: undefined 

Warum so?

Sehen Sie das Ergebnis zu verstehen, was ich meine

result

Die Aufgaben, die ich getan habe:

  1. Verwenden Sie eine Klasse Person und erweitern sie für die Mitarbeiter und Kunden Klassen.
  2. Das Person-Objekt hat eine private name -Eigenschaft und eine Getter-Methode für den Namen.
  3. Die Employee-Klasse hat zwei private Mietdaten und Gehalt. Es hat auch Getter-Methoden für die zwei Eigenschaften.
  4. Die Customer-Klasse hat eine private Vertragsnummer-Eigenschaft und einen Getter für die Vertragsnummer.

Der Code:

//4)Create a Person class 
 
class Person{ 
 
    constructor(firstName, lastName) { 
 
    this.firstname = firstName; 
 
    this.lastname = lastName; 
 
    var _name = name;// create a private name property for the Person class 
 

 
    // create a getter method for the name for the Person class 
 
    this.getName = function() { 
 
     return _name; 
 
    }; 
 

 
    this.getFullName = function() { 
 
     return this.firstname+ " " + this.lastname; 
 
    }; 
 
    } 
 
} 
 

 
// extend Person class for the Employee and Customer classes. 
 
class Employee extends Person { 
 
    constructor(hireDate, salary){ 
 

 
    super(hireDate, salary); 
 
    var _hiredate = hireDate; // create a private property hire date for Employee class 
 
    var _salary = salary; // create a private property salary for Employee class 
 

 
    // create a getter method for the hire date s 
 
    this.getHireDate = function(){ 
 
    return _hiredate; 
 
}; 
 
    // create a getter method for the salary 
 
    this.getSalary = function(){ //varianta alternativa: Employee.prototype.getSalary = function(){ 
 
    return _salary; 
 
}; 
 
} 
 
} 
 

 

 
class Customer extends Person { 
 
constructor(contractNumber){ 
 

 
super(contractNumber); 
 
var _contractNumber = contractNumber; // create a private contract number for Customer class 
 

 

 
//create a getter for the contract number. 
 
this.getcontractNumber = function(){ 
 
return _contractNumber; 
 
}; 
 
}; 
 
}

+0

Warum nennen Sie 'super (hireDate, Gehalt);'? Wenn '(firstName, lastName) 'erwartet wird ... – evolutionxbox

+0

Auch der Konstruktor' customer 'hat keine zwei Argumente. Es hat eine 'contractNumber'. --- Ich glaube nicht, dass klassische OOP in diesem Fall das ist, was du willst, vielleicht versuche [ente-typing] (https://stackoverflow.com/questions/3379529/duck-typing-in-javascript)? – evolutionxbox

+0

neu formatiert und bewegte Bild inline – garyh

Antwort

0

Ich denke, es gibt einige Probleme mit Ihnen super Anrufe.

//4)Create a Person class 
 
class Person{ 
 
    constructor(firstName, lastName) { 
 
    this.firstname = firstName; 
 
    this.lastname = lastName; 
 
    var _name = name;// create a private name property for the Person class 
 

 
    // create a getter method for the name for the Person class 
 
    this.getName = function() { 
 
     return _name; 
 
    }; 
 

 
    this.getFullName = function() { 
 
     return this.firstname+ " " + this.lastname; 
 
    }; 
 
    } 
 
} 
 

 
// extend Person class for the Employee and Customer classes. 
 
class Employee extends Person { 
 
    constructor(firstname, lastname, hireDate, salary){ 
 

 
    super(firstname, lastname); 
 
    var _hiredate = hireDate; // create a private property hire date for Employee class 
 
    var _salary = salary; // create a private property salary for Employee class 
 

 
    // create a getter method for the hire date s 
 
    this.getHireDate = function(){ 
 
    return _hiredate; 
 
}; 
 
    // create a getter method for the salary 
 
    this.getSalary = function(){ //varianta alternativa: Employee.prototype.getSalary = function(){ 
 
    return _salary; 
 
}; 
 
} 
 
} 
 

 

 
class Customer extends Person { 
 
constructor(firstname, lastname, contractNumber){ 
 

 
super(firstname, lastname); 
 
var _contractNumber = contractNumber; // create a private contract number for Customer class 
 

 

 
//create a getter for the contract number. 
 
this.getcontractNumber = function(){ 
 
return _contractNumber; 
 
}; 
 
}; 
 
} 
 

 
var user3 = new Customer ("Sergiu", "Tataru", 999); 
 
console.log(user3.lastname)

+0

ja, jetzt sehe ich die Fehler!thx –

0

Sie rufen:

var user3 = new Customer ("Sergiu", "Tataru"); 

aber die Argumente der Kunden Konstruktor sind contractNumber, so dass es ganz normal ist, wird der Nachname nicht definiert.

Dieser Konstruktor ruft den Konstruktor der Person mit der contractNumber auf, daher sollten Sie diesen Wert ('Sergiu' hier) im Vornamen finden, aber im Nachnamen wird nichts übergeben.

EDIT

Sie sollten so etwas tun:

class Customer extends Person { 
constructor(firstname, lastname, contractNumber){ 

super(firstname, lastname); 
var _contractNumber = contractNumber; // create a private contract number for Customer class 


//create a getter for the contract number. 
this.getcontractNumber = function(){ 
return _contractNumber; 
}; 
}; 
} 

Blick auf die Konstruktor-Schnittstelle und am super Anruf.

+0

Aber er erbt nicht das Vornamen- und Nachname-Argument von der übergeordneten Person-Klasse? –

+0

Es tut, aber wenn Sie Ihr Objekt mit '('Sergiu', 'Tataru')' initialisieren, wird es keinen Wert für den Nachnamen geben. Du solltest 'firstname == 'Sergiu'' und' contractNumber ==' Sergiu'' erhalten. Vererbung funktioniert gut, was nicht funktioniert, ist die Art, wie Sie die Konstruktoren und die 'Super'-Aufrufe verwalten. – sjahan

+0

Ok, jetzt verstehe ich, ich werde einige Änderungen vornehmen und es sollte funktionieren, thx –

Verwandte Themen