blog

ネイティブJSにおけるプロトタイプ継承のいくつかのタイプの違い。

これらのメソッドやnew Father()は、親クラスのプライベート・プロパティも継承します。createは、プロトタイプのポインティングを変更するためのプロトタイプチェーンを作成します。次の2つは、...

Nov 3, 2020 · 2 min. read
シェア
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() を使うことをお勧めします。

Read next

フェッチとパッケージ化の使用

フェッチの使用は、httpリクエストを達成するために使用されるes6新しい組み込みのメソッドは、ajaxはまた、jsのネイティブコンテンツ、jqueryとaxiosですが、ajaxのカプセル化カプセル化fの方法のいくつかに基づいてフェッチします。

Nov 3, 2020 · 3 min read