JavaScript オブジェクトはプロトタイプ オブジェクトからプロパティを継承します。すべてのオブジェクトにはプロトタイプがあり、プロトタイプのすべてのプロパティは、それをプロトタイプとして使用するオブジェクトのプロパティと似ています。簡単に言えば、すべてのオブジェクトはプロトタイプからプロパティ を継承します。
(各オブジェクトはそのプロトタイプからプロパティを継承します)。
オブジェクトのプロトタイプは、そのコンストラクター関数によって定義されます。 JavaScript のすべての関数にはプロトタイプ プロパティがあります。このプロパティは最初は空で、追加したプロパティはコンストラクターによって作成されたオブジェクトによって所有されます。
プロトタイプ オブジェクトはコンストラクターに関連付けられます。これは、プロトタイプがメソッドや他の定数を配置するのに理想的な場所になる可能性があることを意味します。プロトタイプ内のプロパティは、新しく作成されたオブジェクトにはコピーされません。そのプロパティは、オブジェクトのプロパティとまったく同じように見えます。これは、プロトタイプを使用すると、同じタイプの複数のオブジェクトが占有するメモリを大幅に削減できることを意味します。
各クラスには、一連のプロパティを持つプロトタイプ オブジェクトが 1 つだけあります。ただし、実行時にクラスの複数のインスタンスを作成する場合があります。では、プロトタイプのプロパティへの読み取りまたは書き込みが発生するとどうなるでしょうか?
属性を読み取るとき、JavaScript はまずオブジェクト自体にこの属性があるかどうかを調べます。ない場合は、プロトタイプにその属性が存在するかどうかを検索します。そうであれば、結果が返されます。
プロトタイプの属性を記述する場合、複数のオブジェクトがプロトタイプを共有するため、当然ながらプロトタイプに直接書き込むことはできません。このとき、JavaScript は実際にオブジェクト上に同じ名前のプロパティを作成し、そこに値を書き込みます。次回このプロパティを読み取るとき、JavaScript はオブジェクトのプロパティでそれをすぐに見つけるため、プロトタイプを調べる必要はありません。このとき、「オブジェクトのプロパティがプロトタイプのプロパティをマスクまたは非表示にする」と言います。(影または非表示)。
上記の議論からわかるように、実際、クラスを設計するとき、マスターする必要があるのは 1 つの原則だけです。プロトタイプで一部のメソッドのみを定義する (メソッドは通常は変更されません)、定数、定数など。 これにより、混乱が少なくなります。
例:
// クラスのコンストラクター メソッドを定義します。
// これを使用して、
// それぞれの Circle オブジェクト。
関数Circle(x, y, r)
{
この.x = x; // 円の中心の X 座標
これ.y = y; // 円の中心の Y 座標
これ.r = r; // 円の半径
}
// Create and discard an initial Circle object.
// This forces the prototype object to be created in JavaScript 1.1.
new Circle(0,0,0);
// Define a constant: a property that will be shared by
// all circle objects. Actually, we could just use Math.PI,
// but we do it this way for the sake of instruction.
Circle.prototype.pi =
3.14159;
// 円の円周を計算するメソッドを定義します。
// まず関数を宣言し、それをプロトタイプ プロパティに割り当てます。
// 上記で定義した定数の使用に注意してください。
function Circle_circumference( ) { return
2
*
this.pi *
これ.r; }
Circle.prototype.circumference =Circle_circumference;
// 別のメソッドを定義します。今回は関数リテラルを使用して
// 関数を定義し、それをプロトタイプ プロパティに割り当てます。
Circle.prototype.area =
関数( ) { return
this.pi *
これ.r *
これ.r; }
// Circle クラスが定義されています。
// これで、インスタンスを作成し、そのメソッドを呼び出すことができます。
var c =
new Circle(0.0、0.0、1.0);
var a =c.area( );
var p = c .circumference( );
組み込みクラスのプロトタイプ
String や Date などのシステム組み込みクラスを持つことができるのはユーザー定義クラスだけではありません。プロトタイプもいくつかあります。また、新しいメソッドやプロパティなどを追加することもできます。
The following code adds a useful function to all String objects:
// Returns true if the last character is c
String.prototype.endsWith =
function(c) {
return (c ==
this.charAt(this.length-1))
}
Then we can call it like this:
var message =
"hello world";
message.endsWith('h') // Returns false
message.endsWith('d') // Returns true