ホームページ >ウェブフロントエンド >フロントエンドQ&A >JavaScriptでのプロトタイプの使い方を詳しく解説

JavaScriptでのプロトタイプの使い方を詳しく解説

PHPz
PHPzオリジナル
2023-05-21 09:09:07497ブラウズ

JavaScript は非常に人気のあるプログラミング言語です。 JavaScript の威力はプロトタイプにあります。

プロトタイプは、JavaScript オブジェクト モデルの概念です。これにより、他のオブジェクトからプロパティとメソッドを継承してオブジェクトを構築できるようになります。これが JavaScript での継承の仕組みです。

この記事では、JavaScript におけるプロトタイプの使い方を詳しく紹介します。

1. プロトタイプとは

JavaScript のすべてのオブジェクトは、そのプロトタイプから派生します。オブジェクトのプロトタイプは、プロトタイプ チェーンを持つ別のオブジェクトです。このプロトタイプ チェーン上の各オブジェクトは、元のオブジェクトから祖先オブジェクト (オブジェクトのプロトタイプ) まで段階的に派生します。

例:

//创建一个对象
var obj = {};

上記のコードは空のオブジェクトを作成し、そのプロトタイプ チェーンは次のようになります:

obj -> Object.prototype -> null

オブジェクト obj は、Object.prototype オブジェクトから派生します。 Object.prototype は、JavaScript のすべてのオブジェクトの祖先です。

2. プロトタイプとコンストラクター

JavaScript のプロトタイプに密接に関連する 2 つの概念、コンストラクターとインスタンスがあります。

  1. Constructor

Constructor は、特定のタイプのオブジェクトを作成するために使用される関数です。コンストラクターはプロトタイプを使用してプロパティと関数を定義できます。例:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

上記のコードは、name と age の 2 つのパラメーターを持つコンストラクター Person を定義します。コンストラクターでは、 this キーワードを使用してオブジェクト インスタンスのプロパティを設定します。次に、Person オブジェクトを作成しましょう。

var person1 = new Person('Tom', 20);

このオブジェクト person1 は、Person コンストラクターによって作成され、name と age という 2 つの属性を持ちます。

  1. インスタンス

インスタンスは、コンストラクターによって作成されるオブジェクトです。インスタンスは、コンストラクター プロトタイプで定義されたプロパティとメソッドにアクセスできます。例:

//定义Person的原型方法
Person.prototype.sayHello = function() {
  console.log('Hello, my name is ' + this.name);
}
//调用对象方法
person1.sayHello();

は、すべての Person インスタンスからアクセスできる Person プロトタイプにメソッド SayHello を定義します。したがって、person1.sayHello() メソッドを呼び出すと、次のように出力されます。 こんにちは、私の名前はトムです。

3. プロトタイプ継承

プロトタイプ継承は、JavaScript における主な継承方法です。これはプロトタイプ チェーンを通じて実装されます。

継承とは、あるオブジェクトが別のオブジェクトのプロパティとメソッドにアクセスできることを意味します。たとえば、子オブジェクトは親オブジェクトのプロパティとメソッドを継承できます。 JavaScript では、オブジェクトは継承を通じて別のオブジェクトのプロパティとメソッドを所有できます。

プロトタイプ オブジェクトにプロパティとメソッドを追加できます。これらのプロパティとメソッドは、コンストラクターによって作成されたインスタンスによって継承されます。例:

//定义一个Animal对象
function Animal(name) {
  this.name = name;
}
//在Animal的原型上定义一个属性
Animal.prototype.color = 'red';
//创建一个实例
var cat = new Animal('Tom');

上記のコードでは、name 属性とプロトタイプ属性 color を持つ Animal オブジェクトを定義します。次に、Animal プロトタイプ属性 color を継承する cat インスタンスを作成します。

hasOwnProperty() メソッドを使用すると、インスタンスに固有のプロパティが含まれているかどうかを確認できます。例:

console.log(cat.hasOwnProperty('name')); // true
console.log(cat.hasOwnProperty('color')); // false

4. プロトタイプの静的メソッドとプロパティ

静的メソッドとプロパティはコンストラクター自体に属し、インスタンスには属しません。 ES5 より前の JavaScript には、静的メソッドとプロパティを提供するための正式なメカニズムがなかったため、通常、開発者はそれらを手動でコンストラクターに追加していました。

例:

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.create = function(name, age) {
  return new Person(name, age);
}

上記のコードでは、静的メソッド create() を定義します。このメソッドは、インスタンスからではなく、コンストラクター自体から呼び出すことができます。

ES6 では、クラス構文を使用して静的メソッドとプロパティを定義できます。例:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  static create(name, age) {
    return new Person(name, age);
  }
}

上記のコードでは、クラス構文を使用して静的メソッド create() を定義します。

5. プロトタイプ継承の欠点

プロトタイプ継承は、任意のオブジェクトのプロパティとメソッドを継承できるため、非常に強力かつ柔軟です。しかし、いくつかの欠点もあります。

  1. すべてのインスタンスはプロトタイプを共有します

プロトタイプは共有されるため、同じコンストラクターから作成されたすべてのインスタンスは同じプロトタイプを共有します。 1 つのインスタンスがプロトタイプのプロパティまたはメソッドを変更すると、すべてのインスタンスが影響を受けます。

  1. インスタンスのプライベート変数にアクセスできません

プロトタイプ メソッドは、インスタンスのプライベート変数 (つまり、コンストラクター内で定義された変数) にアクセスできません。これらのプライベート変数はコンストラクター内でのみ使用できるためです。

6. 概要

プロトタイプは JavaScript の非常に強力な概念であり、継承や共有コードなどの実装に使用できます。実際の開発では、プロトタイプ継承を適切に使用すると、開発効率の向上とコード量の削減に役立ちます。ただし、プロトタイプ継承の欠点、特にプロトタイプの共有やプライベート変数にアクセスできないなどの問題についても明確にする必要があります。

以上がJavaScriptでのプロトタイプの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。