ユーザー JonathanLonowski は、継承の設定時に構造の呼び出しを回避する方法についての質問に既に回答しています。しかし、あなたの質問は、JavaScript で継承がどのように機能するかについての一般的な質問でもあります。したがって、このトピックを説明するための私の試みは次のとおりです。
継承に関して言えば、基本的にやりたいことは、プロトタイプ チェーンを強化することです。
それで、プロトタイプチェーンは何ですか?
ie を使用してオブジェクトのプロパティを要求するとobj.prop、JavaScript はまずオブジェクトobjにそのようなプロパティがあるかどうかを確認します。そうでない場合は、そのオブジェクトのプロトタイプにそのようなプロパティがあるかどうかを確認します。そうでない場合は、プロトタイプのプロトタイプにそのようなプロパティがあるかどうかなどを確認します。
コンストラクター関数を使用して新しいオブジェクトを作成するとobj = new B()、プロトタイプ チェーンは次のようになります。
obj -> B.prototype -> Object -> null
継承がプロトタイプ チェーンでどのように機能するか
Bオブジェクトが type のオブジェクトから継承されるようにするにはA、プロトタイプ チェーンを次のようにします。
obj -> B.prototype -> A.prototype -> Object -> null
これを実現するには、 の後にプロトタイプ チェーンを「分割」し、B.prototype代わりに の完全なプロトタイプ チェーンを挿入しAます。つまり、B.prototypeを指すように設定しA.prototypeます。
前に行ったように、これを行うことができます。
B.prototype = new A();
では、なぜこれが機能するのでしょうか。によって作成されたオブジェクトにnew A()は、次のプロトタイプ チェーンがあります。
objA -> B.prototype -> Object -> null
このオブジェクトでオーバーライドB.prototypeすると、型のオブジェクトのプロトタイプ チェーンはB次のようになります。
objB -> objA -> A.prototype -> Object -> null
ご覧のとおり、機能します。単にオーバーライドB.prototypeするだけで、プロパティのようないくつかのプロパティが失われconstructorます。したがって、constructorで型のオブジェクトのを取得しようとするBとobjB.constructor、最初にオブジェクト自体を調べて見つからず、次に調べて見つけられず、次に調べてobjAfindA.prototypeを検索しますがA、これは間違っています。プロパティが頻繁に必要になるわけではありませんが、constructorオーバーライド後に再度設定することをお勧めしますB.prototype。
B.prototype = new A();
B.prototype.constructor = B;
さて、あなたの方法は、プロトタイプ チェーンのリンクを実現するための 1 つの方法にすぎません。JonathanLonowski による解決策は別のものであり、 function を呼び出さないため、実際にはより優れたものAです。type のオブジェクトと同じプロトタイプ チェーンを持つ空のオブジェクトを作成しますA。
(empty object) -> A.prototype -> Object -> null
別の解決策は、オーバーライドせずに変更して、の代わりにB.prototype単純に指すようにすることです。すべてのブラウザーがこれをサポートしているわけではありませんが、一部のブラウザーでは、プロパティを設定することでこれを実現できます。A.prototypeObject__proto__
B.prototype.__proto__ = A.prototype;
これにより、次のプロトタイプ チェーンが生成されます。
obj -> B.prototype -> A.prototype -> Object -> null
あちこちで単純化したことに注意してください。ただし、これにより、それがどのように機能するかがわかると思います。理解すべき非常に基本的なことは、プロトタイピングです。現在、技術的には、すべてのオブジェクトが持つ真のプロトタイプ プロパティは 1 つだけであり、それが内部[[prototype]]プロパティです。JavaScript で直接アクセスすることはできませんが、特定の条件下で設定および操作する必要が.prototypeあります。.__proto__