3

本「JavaScript the definitive guide 5 edition」のセクション 9.2 プロトタイプと継承で、次の言葉を見つけました。

前のセクションでは、new 演算子が新しい空のオブジェクトを作成し、そのオブジェクトのメソッドとしてコンストラクター関数を呼び出すことを示しました。ただし、これは完全な話ではありません。空のオブジェクトを作成した後、 new はそのオブジェクトのプロトタイプを設定します。オブジェクトのプロトタイプは、そのコンストラクター関数のプロトタイプ プロパティの値です。すべての関数には、関数の定義時に自動的に作成および初期化されるプロトタイプ プロパティがあります。プロトタイプ プロパティの初期値は、単一のプロパティを持つオブジェクトです。このプロパティはコンストラクターと呼ばれ、プロトタイプが関連付けられているコンストラクター関数を参照します。(第 7 章のコンストラクター プロパティを思い出すかもしれません。これが、すべてのオブジェクトにコンストラクター プロパティがある理由です。) このプロトタイプ オブジェクトに追加するプロパティは、コンストラクターによって初期化されたオブジェクトのプロパティのように見えます。

では、それが本当なら、どのようにしてプロトタイプの継承が存在するのでしょうか? つまり、コンストラクター関数のプロトタイプ オブジェクトが最初にコンストラクター プロパティを持っているとしましょう。プロトタイプ オブジェクト自体がオブジェクトであるため、そのコンストラクターを決定するために、 をよく使用しますprototype_object.constructor。しかし、 にはprototype_objectすでにプロパティ自体があり、プロトタイプが関連付けられているコンストラクター関数をconstructor指しています。この状況で、どのように継承が存在できるのでしょうか?

4

4 に答える 4

8

たとえば、犬は哺乳類です。

function Mammal() {
  this.milk = true;
};

function Dog() { this.bark = true; } Dog.prototype = new Mammal;

したがって、 Dog のプロトタイプはMammal のオブジェクトを指します。この Mammal オブジェクトはそのコンストラクターへの参照を持っているため、Dog が新しい場合、JavaScript は Dog プロトタイプが Mammal であることを認識し、Mammal のコンストラクターが呼び出されて有効な Mammal オブジェクト (別のオブジェクト) を生成し、Dog コンストラクターを使用してそれを Dog オブジェクトにします。

これから、のコンストラクターはDog.prototype(Mammal追加のフィールドと関数が追加された哺乳類オブジェクト) ですが、 is のコンストラクターDogですDog。継承が存在するのは、Dog のインスタンスがプロトタイプとして Mammal を持っているためです。したがって、犬は哺乳類です。メソッドが呼び出され、JS が からそれを見つけられない場合、JS は(追加のフィールドと関数が追加されたオブジェクトである) をDog.prototype調べます。Mammal.prototype

お役に立てれば。

于 2010-02-02T08:55:39.790 に答える
2

コンストラクタ プロパティについて心配する必要はありません。これは無関係です。それらの文をスキップすると、よりよく従うことができます。

それでもよくわからない場合は、Google で __proto__ (JS オブジェクトの内部プロトタイプ リファレンス) を検索してください。Firefox や Safari のスクリプトにも公開されています。

良いリファレンスはhttps://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/The_Employee_Example/Object_Properties/Inheriting_Propertiesです

于 2010-02-02T12:58:05.257 に答える
1

オブジェクトがある場合obj、そのプロトタイプは でobj.prototypeあり、そのコンストラクターを参照するコンストラクター プロパティobjobj.prototype.constructorです。

オブジェクトについてobj.prototypeも状況は同じです。たとえばproto = obj.prototype、 のコンストラクタへの参照は にありprotoますproto.prototype.constructor

これは と同じなobj.prototype.prototype.constructorので、 と競合しませんobj.prototype.constructor

于 2010-02-02T09:02:51.103 に答える