2016-11-14 5 views
-1

各子関数でこれを使用してコンストラクタメソッドを呼び出すと、親プロパティを継承できるときに継承のためにプロトタイプオブジェクトを設定する必要があるのはなぜですか?JavaScript継承プロトタイプ

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

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

我々はEmployeeとしてManagerのプロトタイプを設定していない場合でも、継承を使用することができます。

+5

「Employee」のプロトタイプに '新しいManager()instanceof Employee'を試してみてください。 – Ryan

答えて

1

通常、プロトタイプは、プロパティではなくすべてのオブジェクトインスタンス間で共有される単一のプロパティ値を持つため、プロパティには関数/メソッドを配置するために使用されます。また、コンストラクタ内にメソッドを追加する場合、継承のプロトタイプを設定する必要はありません。たとえば、次のコンストラクタは、関数のインスタンスと呼ばれるたびに作成されるので

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

function Manager(name) { 
    Employee.call(this, name); 
    this.reports = []; 
} 

var manager = new Manager('Peter'); 
manager.reportName(); // Peter 

しかし、オブジェクトのコンストラクタ内部メソッド/関数を追加することは、非効率的です。だから、通常、すべてのメソッドではなく、プロパティは、このようなプロトタイプに割り当てられます:

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

Employee.prototype.reportName = function() {return this.name}; 

さて、この場合には、単にコンストラクタを呼び出すだけでは十分ではありません。

function Manager(name) { 
    Employee.call(this, name); 
    this.reports = []; 
} 

var manager = new Manager('Peter'); 
manager.reportName(); // throws an error 

あなたが設定する必要がありますプロトタイプ:

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

var manager = new Manager('Peter'); 
manager.reportName(); // 'Peter' 
関連する問題