この記事では主にJavaScriptの継承メソッドの詳細な説明を紹介しています この記事では、jsの継承、プロトタイプ継承とクラス継承、プロトタイプチェーン継承、クラス継承、組み合わせ継承、プロトタイプ継承などの概念を説明しています。
jsの継承の概念を参照してください
jsでは次の2つの継承メソッドが一般的に使用されます:
プロトタイプチェーン継承(オブジェクト間の継承)
クラスベースの継承(コンストラクター間の継承)
jsは異なるためJava は真のオブジェクト指向言語ですが、js はオブジェクトに基づいており、クラスの概念がありません。したがって、継承を実装したい場合は、js のプロトタイプ機構を使用するか、オブジェクト指向言語ではクラスを使用してカスタム オブジェクトを作成します。ただし、js 内のすべてはオブジェクトなので、カスタム オブジェクトを作成するにはどうすればよいでしょうか?これには、js プロトタイプを使用する必要があります。 プロトタイプを単にテンプレートと見なすことができます。新しく作成されたカスタム オブジェクトはすべて、このテンプレート (プロトタイプ) のコピーです (実際にはコピーではなくリンクですが、このリンクは表示されません。新しくインスタンス化されたオブジェクト内の、プロトタイプ オブジェクトを指す非表示の Proto ポインター)。
js は、コンストラクターとプロトタイプを通じて、実装されたクラスの機能をシミュレートできます。 さらに、js クラスの継承の実装もプロトタイプ チェーンに依存します。
プロトタイプの継承とクラスの継承クラスの継承とは、サブタイプのコンストラクター内でスーパータイプのコンストラクターを呼び出すことです。 厳密なクラス継承はあまり一般的ではなく、通常は組み合わせて使用されます:
コードは次のとおりです:
function Super(){ this.colors=["red","blue"]; } function Sub(){ Super.call(this); }
プロトタイプ チェーンの継承
サブクラスが親クラスの属性 (メソッドを含む) を継承するには、まず、コンストラクタ。次に、親クラスの新しいインスタンスをコンストラクターのプロトタイプに割り当てます。コードは次のとおりです。
コードは次のとおりです。<script> function Parent(){ this.name = 'mike'; } function Child(){ this.age = 12; } Child.prototype = new Parent();//Child继承Parent,通过原型,形成链条 var test = new Child(); alert(test.age); alert(test.name);//得到被继承的属性 //继续原型链继承 function Brother(){ //brother构造 this.weight = 60; } Brother.prototype = new Child();//继续原型链继承 var brother = new Brother(); alert(brother.name);//继承了Parent和Child,弹出mike alert(brother.age);//弹出12 </script>
し、手動で継承する必要はありません。では、それらの所属は何でしょうか?
プロトタイプとインスタンスの間の関係は 2 つの方法で決定できます。 OperatorのinstanceofとisPrototypeof()メソッド:
コードは次のとおりです:alert(brother instanceof Object)//true alert(test instanceof Brother);//false,test 是brother的超类 alert(brother instanceof Child);//true alert(brother instanceof Parent);//true
jsでは、継承された関数をスーパータイプ(親クラス、基底クラスでも可)と呼び、継承された関数をサブタイプ(サブクラス、派生クラス)と呼びます。 )。プロトタイプ継承の使用には主に 2 つの問題があります:
まず、リテラルでプロトタイプをオーバーライドすると、参照型のプロトタイプを使用する関係が壊れ、サブタイプはスーパータイプにパラメーターを渡すことができなくなります。 疑似クラスは、参照の共有とスーパータイプのパラメーターを渡すことができないという問題を解決します。 コードは次のとおりです。
コンストラクターの借用 これで先ほどの2つの問題は解決しますが、プロトタイプがないと再利用できないので、プロトタイプチェーン+借用コンストラクターパターンが必要になります
複合継承
のコードです。
<script> function Parent(age){ this.name = ['mike','jack','smith']; this.age = age; } function Child(age){ Parent.call(this,age); } var test = new Child(21); alert(test.age);//21 alert(test.name);//mike,jack,smith test.name.push('bill'); alert(test.name);//mike,jack,smith,bill </script>
<script> function Parent(age){ this.name = ['mike','jack','smith']; this.age = age; } Parent.prototype.run = function () { return this.name + ' are both' + this.age; }; function Child(age){ Parent.call(this,age);//对象冒充,给超类型传参 } Child.prototype = new Parent();//原型链继承 var test = new Child(21);//写new Parent(21)也行 alert(test.run());//mike,jack,smith are both21 </script>
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
この継承メソッドは、作成プロセスをカプセル化するためにプロトタイプと
ファクトリーパターンを組み合わせます。
コードは次のとおりです:
<script> function obj(o){ function F(){} F.prototype = o; return new F(); } var box = { name : 'trigkit4', arr : ['brother','sister','baba'] }; var b1 = obj(box); alert(b1.name);//trigkit4 b1.name = 'mike'; alert(b1.name);//mike alert(b1.arr);//brother,sister,baba b1.arr.push('parents'); alert(b1.arr);//brother,sister,baba,parents var b2 = obj(box); alert(b2.name);//trigkit4 alert(b2.arr);//brother,sister,baba,parents </script>
组合式继承是js最常用的继承模式,但组合继承的超类型在使用过程中会被调用两次;一次是创建子类型的时候,另一次是在子类型构造函数的内部
代码如下:
<script> function Parent(name){ this.name = name; this.arr = ['哥哥','妹妹','父母']; } Parent.prototype.run = function () { return this.name; }; function Child(name,age){ Parent.call(this,age);//第二次调用 this.age = age; } Child.prototype = new Parent();//第一次调用 </script>
以上代码是之前的组合继承,那么寄生组合继承,解决了两次调用的问题。
寄生组合式继承
代码如下:
<script> function obj(o){ function F(){} F.prototype = o; return new F(); } function create(parent,test){ var f = obj(parent.prototype);//创建对象 f.constructor = test;//增强对象 } function Parent(name){ this.name = name; this.arr = ['brother','sister','parents']; } Parent.prototype.run = function () { return this.name; }; function Child(name,age){ Parent.call(this,name); this.age =age; } inheritPrototype(Parent,Child);//通过这里实现继承 var test = new Child('trigkit4',21); test.arr.push('nephew'); alert(test.arr);// alert(test.run());//只共享了方法 var test2 = new Child('jack',22); alert(test2.arr);//引用问题解决 </script>
call和apply
全局函数apply和call可以用来改变函数中this的指向,如下:
代码如下:
// 定义一个全局函数 function foo() { console.log(this.fruit); } // 定义一个全局变量 var fruit = "apple"; // 自定义一个对象 var pack = { fruit: "orange" }; // 等价于window.foo(); foo.apply(window); // "apple",此时this等于window // 此时foo中的this === pack foo.apply(pack); // "orange"
以上がJSの継承メソッドを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。