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