通常、プロトタイプは、プロパティではなくすべてのオブジェクトインスタンス間で共有される単一のプロパティ値を持つため、プロパティには関数/メソッドを配置するために使用されます。また、コンストラクタ内にメソッドを追加する場合、継承のプロトタイプを設定する必要はありません。たとえば、次のコンストラクタは、関数のインスタンスと呼ばれるたびに作成されるので
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'
「Employee」のプロトタイプに '新しいManager()instanceof Employee'を試してみてください。 – Ryan