継承以外JavaScriptのコンストラクタ(オブジェクト()メソッド、浅いと深いコピーのコピー)

まず、継承されているもの、「非構造的機能」?

たとえば、今、私たちは、オブジェクトは、「中国人」と呼ばれています

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

 

おすすめ

転載: www.cnblogs.com/Leophen/p/11140586.html