JavaScript におけるクラス継承は、1 つ以上の親クラスからプロパティとメソッドを継承する新しいクラスを作成できるメカニズムです。これにより、より複雑なオブジェクト階層を構築し、共通の動作とプロパティを共有できるようになります。
以下に、いくつかの一般的なクラス継承メソッドを示します。
1. **単一継承 (単一継承)**: サブクラスは 1 つの親クラスからのみ継承できます。
```javascript
class ChildClass extends ParentClass { // サブクラスの定義 } ```
2. **多重継承 (Multiple Inheritance)**: サブクラスは複数の親クラスから継承できます。
JavaScript では多重継承はネイティブにサポートされていませんが、多重継承の効果は (mixin) モードでミックスすることでシミュレートできます。
```javascript
class ChildClass extends Mixin(ParentClass1, ParentClass2) { // サブクラスの定義 } ```
3. **マルチレベル継承 (マルチレベル継承)**: サブクラスは別のサブクラスから継承して、継承階層を形成できます。
```javascript
class ChildClass extends ParentClass { // サブクラスの定義 }
class GrandchildClass extends ChildClass { // 孫クラスの定義 } ``
継承では、サブクラスは `extends` キーワードを使用して継承元の親クラスを指定します。サブクラスは親クラスのプロパティとメソッドにアクセスし、独自のプロパティとメソッドを追加できます。
サブクラスが親クラスと同じ名前のメソッドを定義すると、サブクラスのメソッドが親クラスのメソッドをオーバーライド(オーバーライド)し、動作が変更されます。サブクラスは「super」キーワードを使用してコンストラクター、メソッドを呼び出し、親クラスのプロパティにアクセスできます。
以下は、継承を使用してグラフ オブジェクト階層を作成する方法を示す簡単な例です。
```javascript
class Shape { constructor(color) { this.color = color; }
getColor() { this.color を返します。 }
area() { console.log("このメソッドはサブクラスによってオーバーライドされる必要があります。"); } }
クラス Circle extends Shape { constructor(color, radius) { super(color); this.radius = 半径; }
area() { return Math.PI * this.radius * this.radius; } }
class Rectangle extends Shape { constructor(color, width, height) { super(color); this.width = 幅; this.height = 高さ; }
area() { return this.width * this.height; } }
// Circle と Rectangle のインスタンスを作成します
const Circle = new Circle("red", 5);
const rectangle = new Rectangle("blue", 4, 6);
console.log(circle.getColor()); // 出力: 赤
console.log(circle.area()); // 出力: 78.53981633974483
console.log(rectangle.getColor()); // 出力: 青
console.log(rectangle.area()); // 出力: 24
```
上の例では、`Circle` と `Rectangle` のサブクラスは両方とも、`Shape` 親クラスのプロパティとメソッドを継承しています。サブクラスはカスタマイズ可能
そうです!以下は、JavaScript でのクラス継承を示すより具体的な例です。
```javascript
// 父类
class Animal { constructor(name) { this.name = name; }
Eat() { console.log(`${this.name} は食べています。`); } }
// サブクラスは親
クラスを継承します class Dog extends Animal { constructionor(name, Breeze) { super(name); this.breed = Breed; }
bark() { console.log(`${this.name} が吠えています。`); } }
// サブクラスのインスタンスを作成します
const myDog = new Dog("Buddy", "Golden Retriever");
// サブクラス メソッドを呼び出します
myDog.eat(); // 出力: Buddy が食べています
myDog.bark(); // 出力: Buddy が吠えています
console.log(myDog.name); // 出力: Buddy
console . log(myDog.breed); // 出力: ゴールデンレトリバー
``
上の例では、「Animal」は「name」プロパティと「eat()」メソッドを持つ親クラスです。`Dog` は、`extends` キーワードを通じて `Animal` 親クラスを継承するサブクラスです。サブクラスのコンストラクターは、`super()` を使用して親クラスのコンストラクターを呼び出し、対応するパラメーターを渡します。
サブクラス `Dog` は、サブクラス固有の動作である `bark()` メソッドも定義します。「Dog」クラスのインスタンス「myDog」を作成し、親クラスの「eat()」メソッドとサブクラスの「bark()」メソッドを呼び出します。「name」や「breed」などのインスタンスのプロパティにもアクセスできます。
継承を通じて、サブクラスは親クラスのプロパティとメソッドを継承でき、また独自の一意のプロパティとメソッドを追加することもできます。このようにして、コードの再利用と拡張が実現できるため、オブジェクトは共通の動作と特性を共有し、必要に応じて独自の動作をカスタマイズできます。