2016-08-23 3 views
1

Mozilla's Referenceを経由してこの単純な関係になっていました。Javascript継承呼び出しの振る舞い

function Employee() { 
    this.name = ""; 
    this.dept = "general"; 
} 

function Manager() { 
    Employee.call(this); 
    this.reports = []; 
} 
Manager.prototype = Object.create(Employee.prototype); 

Apparently、これは従業員からマネージャーへの継承のような関係を形成します。 Employee.call(this);Employee.prototypeに代わりにオブジェクトを割り当てるのがと ある理由それはManager.prototypeに割り当てられているわからないものを、ここで

二つの質問、。マネージャーは従業員から継承しているというのが私の考えです。おそらく、これは実際には両方のオブジェクトが互いにプロパティを取得できることを意味するプロトタイプチェーンの概念です。

説明が分かりますか。

+0

Managerは従業員クラスのプロパティを継承し、独自のプロパティ/メソッドも持ちます。しかし、EmployeeクラスはManagerのプロパティを継承しません。 –

+0

"*オブジェクトを' Employee.prototype' *に代入する代わりに* * - どのオブジェクト? – Bergi

+0

@Bergi 'Employee.prototype = Object.create(Manager.prototype);' – Aaron

答えて

2
  1. Employee.call(this)Employee()を呼ぶようなものですが、代わりに新しいオブジェクトを作成するためにそれを使用するのではなく、代わりに現在のManagerを変更します。この例では、Managernamedeptを設定しています。
  2. この文:

    Manager.prototype = Object.create(Employee.prototype); 
    

    Employee.prototype.x = valのように設定されたすべての属性もManager.prototypeで利用できるようになりますことを意味します。ただし、Manager.prototypeでオーバーライドすると、オーバーライドされます。
    このプロパティを正しく設定するには、Manager.prototype.constructor = Managerも実行する必要があります。

+0

'Employee.call(this)'をJavaで 'super()'と考えるのは大丈夫ですか? – Aaron

+0

私はそれが似ていると思います。 (私はJavaも知らない)。 –

+0

@Aaron:はい、そうです。子インスタンスの親コンストラクタを呼び出して、親プロパティを作成して初期化します。 – Bergi