まず、継承されているもの、「非構造的機能」?
たとえば、今、私たちは、オブジェクトは、「中国人」と呼ばれています
VAR中国= { 国: '中国' };
もう一つの目的は、「プログラマ」と呼ばれています。
VaRのプログラマー= { 経歴: 'プログラマ' }
どのように我々は、「中国の人々を」継承する「プログラマ」を聞かせすることができますか?
ここでは、2つのオブジェクトはコンストラクタがコンストラクタメソッドで「継承」を達成することができないのではなく、普通のオブジェクトです。
二つ、オブジェクト()メソッド
関数オブジェクト(O){ 関数F(){} F.prototype = O。 返す 新しい)F(; }
ここで()関数オブジェクトは、ので、一緒に親オブジェクトと子オブジェクトのprototypeプロパティ、ポイントの親オブジェクト、子オブジェクトです。
最初の親オブジェクト、生成された子オブジェクトに基づいて、使用された場合:
VaRのプログラマ=オブジェクト(中国語);
次いで、一緒にプロパティサブオブジェクト自体と。
Programmer.careerは= 'プログラマ';
このとき、子オブジェクトは、親オブジェクトのプロパティを継承しています。
アラート(Programmer.nation); // 中国
第三に、シャローコピー
親オブジェクトのプロパティには、子オブジェクトへのすべてのコピーにも継承を実現することができます。
次の関数は、あること、コピーを作成します:
関数extendCopy(P){ VARの C = {}; ため(VAR I におけるP){ C [i]は = P [I]を、 } c.uber = P。 リターンC; }
使用を書きます:
VaRのプログラマ= extendCopy(中国語); Programmer.career = 'プログラマ、 アラート(Programmer.nation); // 中国
しかし、浅いコピー問題がある:プロパティは、実際には、配列の親または別のオブジェクトと等しい場合、単にメモリアドレス子取得オブジェクトではなく、本物のコピーが、それは親の存在を改ざんすることができます。
今すぐ値の配列である性質中国A「誕生の地」に追加します。
Chinese.birthPlaces = [ '北京'、 '上海'、 '広州']。
extendCopy()関数によって、プログラマは、中国を継承しています。
VaRのプログラマ= extendCopy(中国語);
その後、我々は、プログラマーの「発祥の地」のための都市を追加します。
Programmer.birthPlaces.push( '深セン');
この時点で、「出生地」の中国人が変更されましたか?
アラート(Programmer.birthPlaces); // 北京、上海、広州、深セン アラート(Chinese.birthPlaces); // 北京、上海、広州、深セン
だから、extendCopy()単純にコピーしたデータの基本的なタイプは、我々は、このコピーが呼び出されるコール「浅いコピー。」これは、初期の継承jQueryの方法です。
第四に、深いコピー
いわゆる「ディープコピー」、真の意味を達成するための配列やオブジェクトをコピーする機能です。その実装は、ライン上の再帰呼び出し「シャローコピー」限り、難しいことではありません。
関数deepCopy(P、C){ VARの C = C || {}; 用(VAR I におけるP){ 場合(typeof演算の P [I] === 'オブジェクト' ){ C [I] =(P [i]は.constructor ===アレイ)?[]:{}。 deepCopy(P [I]、C [I])。 } 他{ C [I] = P [i]は、 } } 戻りC。 }
書き込みを使用している場合:
たプログラム= deepCopy(中国語);
今、親オブジェクトプロパティ値の配列を追加します。その後、子オブジェクトのプロパティを変更します。
Chinese.birthPlaces = [ '北京'、 '上海'、 '広州' ];
Programmer.birthPlaces.push( '深')。
このとき、親オブジェクトは影響を受けません。
アラート(Programmer.birthPlaces); // 北京、上海、広州、深セン アラート(Chinese.birthPlaces); // 北京、上海、広州
現在、jQueryライブラリを継承するために、このメソッドを使用しています。
継承されたコンストラクタとして、参照してくださいhttps://www.cnblogs.com/Leophen/p/11134437.html