高度なプログラミングの書き方は以下の通りです
リーリーでは、このように書いても同じでしょうか? 唯一の違いは、コンストラクターが異なることですか?
リーリー 2 番目の書き方では、インスタンスが作成されるたびにプロトタイプに対して操作を?qū)g行します。 重要なのは、この操作には意味がなく、この方法はすべてのインスタンスで同じであるということです。
最初の方法では、プロトタイプがコンストラクターの外側(cè)で書かれている場合、定義やメモリ割り當(dāng)ての繰り返しの問題は、形式的にもメモリ割り當(dāng)てを通じても解決できます。
メモリに書き込む最初の方法に対応し、作成したインスタンスの數(shù)に関係なく、各インスタンスは名前、年齢、職業(yè)、レッスンのみを占有します。メモリ內(nèi)には getName のコピーが 1 つだけあり、すべてのインスタンスによって共有されます。2 番目の書き方では、新しく作成されたインスタンスごとに、プロトタイプ定義を?qū)g行するために追加のスペース (スタック) が割り當(dāng)てられます。
リーリー
メソッド 1 でコンストラクターを定義する必要があるのはなぜですか?方法 1 のより賢明なアプローチは、プロトタイプを再割り當(dāng)てするのではなく、必要な屬性 getName のみをプロトタイプに追加し、それを 2 番目のメソッドの定義メソッドである Person.prototype = {getName: function() {}}
),那么上例中p.constructor
返回值將是 Object
に変更することです。プロトタイプは上書きされません。
記述方法に応じて、各インスタンス化プロセス中にストレージ領(lǐng)域がインスタンスに再割り當(dāng)てされます。プロトタイプ パターンの意味の 1 つは、すべてのインスタンスがプロトタイプの屬性とメソッドを共有できることですが、これだけでは問題があります。 。 2 番目の點は、私は依然としてプロトタイプ オブジェクトをリテラルで記述することを好むということです。個人的には、1 つはより直観的であり、2 番目はメンテナンスに役立つと考えています。以下の通り:
リーリーコンストラクタ屬性は必ず記述してください。この屬性が指定されていないと、プロトタイプオブジェクトが書き換えられてしまい、本來の役割を果たせません。
プロトタイプチェーンは完璧ではなく、次の 2 つの問題を含んでいます。
これを考慮して、実際にはプロトタイプチェーンが単獨で使用されることはほとんどありません。質(zhì)問 1: プロトタイプ チェーンに參照型値のプロトタイプが含まれている場合、その參照型値はすべてのインスタンスで共有されます。
質(zhì)問 2: サブタイプを作成するとき (Son のインスタンスの作成など)、パラメーターをスーパータイプ (Father など) のコンストラクターに渡すことはできません。
この目的のために、プロトタイプチェーンの欠點を補うために以下のいくつかの試みが行われます。
コンストラクターを借用します
コンストラクターの借用 (コンストラクタースチール) (古典的な継承とも呼ばれます) と呼ばれる手法の使用を開始しました。
基本的な考え方: サブタイプ コンストラクター內(nèi)でスーパータイプ コンストラクターを呼び出します。まず、プロトタイプチェーン內(nèi)の參照型値の獨立性が保証され、すべてのインスタンスによって共有されなくなります。リーリー
明らかに、コンストラクターを借用すると、プロトタイプ チェーンの 2 つの主要な問題が一気に解決されます。
2 番目に、サブタイプを作成するときに、親タイプにパラメータを渡すこともできます。
これに続いて、コンストラクターのみを借用する場合、コンストラクター パターンの問題を回避することはできません。メソッドはすべてコンストラクター內(nèi)で定義されているため、関數(shù)の再利用は利用できません。また、スーパータイプ ( Father など) も使用できません。これを考慮すると、コンストラクターを借用する手法が単獨で使用されることはほとんどありません。詳細(xì)については、「JS プロトタイプ チェーンと継承」を參照してください。気に入ったらクリックしてください。あなた!