javascript - jsでコンストラクターパターンとプロトタイプパターンを組み合わせる方法
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-05-19 10:33:10
0
5
632

高度なプログラミングの書き方は以下の通りです

リーリー

では、このように書いても同じでしょうか? 唯一の違いは、コンストラクターが異なることですか?

リーリー
曾经蜡笔没有小新
曾经蜡笔没有小新

全員に返信(5)
洪涛

プロトタイプ定義(場所)をコンストラクターの内部と外部に記述することの違いは何ですか?

2 番目の書き方では、インスタンスが作成されるたびにプロトタイプに対して操作を実行します。 重要なのは、この操作には意味がなく、この方法はすべてのインスタンスで同じであるということです。
最初の方法では、プロトタイプがコンストラクターの外側で書かれている場合、定義やメモリ割り当ての繰り返しの問題は、形式的にもメモリ割り当てを通じても解決できます。
メモリに書き込む最初の方法に対応し、作成したインスタンスの数に関係なく、各インスタンスは名前、年齢、職業、レッスンのみを占有します。メモリ内には getName のコピーが 1 つだけあり、すべてのインスタンスによって共有されます。2 番目の書き方では、新しく作成されたインスタンスごとに、プロトタイプ定義を実行するために追加のスペース (スタック) が割り当てられます。

最初の方法と 2 番目の方法でプロトタイプに値を割り当てる方法の違いは何ですか?

大きな違いは、関数クラスが定義されると、そのデフォルトのコンストラクター プロパティがそれ自体になり、そのインスタンスはコンストラクター プロパティにアクセスするときにこの値を返すことです。

リーリー

メソッド 1 でコンストラクターを定義する必要があるのはなぜですか?

方法 1 のより賢明なアプローチは、プロトタイプを再割り当てするのではなく、必要な属性 getName のみをプロトタイプに追加し、それを 2 番目のメソッドの定義メソッドである Person.prototype = {getName: function() {}}),那么上例中p.constructor返回值将是 Object に変更することです。プロトタイプは上書きされません。

いいねを押す +0
習慣沉默

リーリー

いいねを押す +0
PHPzhong

前者の書き方はプロトタイプを書き直すだけですが、あなたの書き方はプロトタイプにメソッドを追加するだけです

いいねを押す +0
世界只因有你

記述方法に応じて、各インスタンス化プロセス中にストレージ領域がインスタンスに再割り当てされます。プロトタイプ パターンの意味の 1 つは、すべてのインスタンスがプロトタイプの属性とメソッドを共有できることですが、これだけでは問題があります。 。 2 番目の点は、私は依然としてプロトタイプ オブジェクトをリテラルで記述することを好むということです。個人的には、1 つはより直観的であり、2 番目はメンテナンスに役立つと考えています。以下の通り:

リーリー

コンストラクタ属性は必ず記述してください。この属性が指定されていないと、プロトタイプオブジェクトが書き換えられてしまい、本来の役割を果たせません。

いいねを押す +0
为情所困

プロトタイプ継承とコンストラクターには多くの違いがあります。 プロトタイプ継承はプロトタイプチェーン継承です。

プロトタイプチェーンは完璧ではなく、次の 2 つの問題を含んでいます。

質問 1: プロトタイプ チェーンに参照型値のプロトタイプが含まれている場合、その参照型値はすべてのインスタンスで共有されます。

質問 2: サブタイプを作成するとき (Son のインスタンスの作成など)、パラメーターをスーパータイプ (Father など) のコンストラクターに渡すことはできません。

これを考慮して、実際にはプロトタイプチェーンが単独で使用されることはほとんどありません。

この目的のために、プロトタイプチェーンの欠点を補うために以下のいくつかの試みが行われます。

コンストラクターを借用します

プロトタイプチェーンにおける上記の 2 つの問題を解決するために、

コンストラクターの借用 (コンストラクタースチール) (古典的な継承とも呼ばれます) と呼ばれる手法の使用を開始しました。

基本的な考え方: サブタイプ コンストラクター内でスーパータイプ コンストラクターを呼び出します。

リーリー

明らかに、コンストラクターを借用すると、プロトタイプ チェーンの 2 つの主要な問題が一気に解決されます。
まず、プロトタイプチェーン内の参照型値の独立性が保証され、すべてのインスタンスによって共有されなくなります。

2 番目に、サブタイプを作成するときに、親タイプにパラメータを渡すこともできます。

これに続いて、コンストラクターのみを借用する場合、コンストラクター パターンの問題を回避することはできません。メソッドはすべてコンストラクター内で定義されているため、関数の再利用は利用できません。また、スーパータイプ ( Father など) も使用できません。これを考慮すると、コンストラクターを借用する手法が単独で使用されることはほとんどありません。詳細については、「JS プロトタイプ チェーンと継承」を参照してください。気に入ったらクリックしてください。あなた!

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート