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