ユーザー 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
、最初にオブジェクト自体を調べて見つからず、次に調べて見つけられず、次に調べてobjA
findA.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.prototype
Object
__proto__
B.prototype.__proto__ = A.prototype;
これにより、次のプロトタイプ チェーンが生成されます。
obj -> B.prototype -> A.prototype -> Object -> null
あちこちで単純化したことに注意してください。ただし、これにより、それがどのように機能するかがわかると思います。理解すべき非常に基本的なことは、プロトタイピングです。現在、技術的には、すべてのオブジェクトが持つ真のプロトタイプ プロパティは 1 つだけであり、それが内部[[prototype]]
プロパティです。JavaScript で直接アクセスすることはできませんが、特定の条件下で設定および操作する必要が.prototype
あります。.__proto__