2017-06-19 19 views
0

私は自分の仕事のためにいくつかのタスクを実行しました。しかし、私はいくつかの問題を抱えています。Javascript/Extended classes/Objects

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

そして、私はUSER3にアクセスするときに、私が受け取る::私には、例えば、Customerクラスの新しいユーザーを追加しようとしているときに

なぜ
lastname: undefined 

私は私が行っている

result

タスク意味を理解するために結果を参照してください:

  1. をPersonクラスを使用し、従業員や顧客 クラスのためにそれを拡張します。
  2. Personオブジェクトには、private nameプロパティとその名前の取得メソッドがあります。
  3. Employeeクラスには、2つのプライベートプロパティがあり、日付と給与が雇用されています。また、2つのプロパティのゲッターメソッドもあります。
  4. Customerクラスには、プライベート契約番号プロパティと契約番号ゲッターがあります。

コード:私はあなたsuper呼び出しでいくつかの問題があると思い

//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

なぜあなたは 'super(hireDate、salary);'を呼びますか? '(firstName、lastName)'を期待しているとき... – evolutionxbox

+0

また、 'customer'コンストラクタには2つの引数がありません。 1つの 'contractNumber'を持っています。 ---私は古典的なOOPがあなたがこの場合にしたいと思うものではないと思うかもしれません。おそらく[ダックタイピング](https://stackoverflow.com/questions/3379529/duck-typing-in-javascript)を試してみてください。 – evolutionxbox

+0

イメージを再フォーマットして移動しました – garyh

答えて

0

//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

はい、間違いがあります。thx –

0

あなたが呼び出す:それは姓が定義されていない非常に正常ですので

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

が、お客様のコンストラクタの引数は、contractNumberです。

このコンストラクタはcontractNumberを使用してPersonのコンストラクタを呼び出します。したがって、firstnameにはこの値('Sergiu')が見つかりますが、lastnameには何も渡されません。あなたはそのようなことをすべき

EDIT

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; 
}; 
}; 
} 

は、コンストラクタの界面でとsuperコールを見てください。

+0

しかし、それは親Personクラスからfirstnameとlastname引数を継承しませんか? –

+0

ですが、オブジェクトを '( 'Sergiu'、 'Tataru')'で初期化すると、姓の値はありません。 'firstname == 'Sergiu''と' contractNumber ==' Sergiu''を取得する必要があります。継承はうまくいきます。うまくいかないのは、コンストラクタと 'super'呼び出しを管理する方法です。 – sjahan

+0

[OK]を今理解して、私はいくつかの変更を行い、それは動作するはずです –