function A(name){
this.name = name;
}
A.prototype.sayA = function(){
console.log(this.name+'Asay')
}
function B(name){
this.name = name;
}
B.prototype.sayB = function(){
console.log(this.name + 'Bsay');
}
B.prototype.proto = A.prototype
//1. __proto__ ,を使ってAのプロトタイプ・メソッドを継承し、プロトタイプ・チェーンによる継承がB自身のプロトタイプ・メソッドをオーバーライドしないようにする。
B.prototype.__proto__ = A.prototype;
let b = new B('bname');
b.sayB();
b.sayA();
Object.setPrototypeOf()
//2.と同じ原理を実現するには、setPrototypeOf()を使う。__proto__を使うことをお勧めする。
Object.setPrototypeOf(B.prototype,A.prototype);
let b = new B('bname');
b.sayB();
b.sayA();
Object.create()
//3.Object.create() を使って、Aを指すプロトタイプを持つ空のオブジェクトを作成する。.prototype;こうすることで、親クラスのプロトタイプ・メソッドを継承できるが、自身のプロトタイプ・メソッドはオーバーライドされる。,
//つまり、createを使ってプロトタイプ継承を実装したい場合は、親クラスを継承した後に、Bにプロトタイプ操作を入れる必要がある。
B.prototype = Object.create(A.prototype,{constructor:{value:B}});//を使うか、次のようにBを指定する。.prototype.construtor = B;
let b = new B('bname');
// b.sayB();,見つからない。上書きされている。
b.sayA();
B.prototype = new A()
//4.new A();これは、親クラスのpublicとprivateのプロパティをすべてプロトタイプに継承する。
B.prototype = new A('aname');
let b = new B('bname');
// b.sayB();をオーバーライドする。オーバーライドされたくない場合は、このB.prototype.__proto__ = new A();
b.sayA();
console.log(b.name);
console.log(b.__proto__.name);//プロトタイプに継承された親クラスのプライベート・プロパティ
まとめ
create()、setPrototypeOf、new Father()、prototype.__proto___、new Father()は親クラスのprivate属性を同時に継承します。createは、プロトタイプのポイントを変更するためにプロトタイプのチェーンを作成します。次の2つのメソッドは、親のプロトタイプを子のプロトタイプのチェーンにアタッチし、ブラウザのパフォーマンスを大量に消費します。
各ブラウザのJavaScriptエンジンでプロトタイプのプロトタイプを変更するのは、 チェーンに要素を挿入するのと同じことなので、非常に遅い操作です。パフォーマンスを考えるなら、Object.create()が良い選択です。これは、プロトタイプチェーンを直接作成するのと同じことで、 チェーンの先頭に要素を追加するのと同じことなので、パフォーマンスはずっと良くなります。
そこで、プロトタイプの継承には、Object.create() を使うことをお勧めします。