Javascriptの非コンストラクタ継承例の詳細説明

PHP中文网
リリース: 2017-06-28 11:53:20
オリジナル
996 人が閲覧しました

この記事では、コンストラクターを使用せずに「継承」を実装する方法を紹介します。よく理解すれば、非常に簡単に理解できるでしょう。

1.「非コンストラクター」継承とは何ですか?

たとえば、「中国語」というオブジェクトがあります。

var Chinese = { nation:'中国' };
ログイン後にコピー

「ドクター」というオブジェクトがもう一つあります。

 var Doctor ={ career:'医生' }
ログイン後にコピー

「Doctor」に「 Chinese 」を継承させるにはどうすればよいでしょうか?つまり、「 Chinese Doctor 」のオブジェクトを生成するにはどうすればよいでしょうか?

ここで、これら 2 つのオブジェクトはコンストラクターではなく通常のオブジェクトであり、コンストラクター メソッドを使用して「継承」を実現できないことに注意してください。

2. Object() メソッド

json 形式の発明者である Douglas Crockford は、これを実行できる object() 関数を提案しました。


function object(o) {

    function F() {}

    F.prototype = o;

    return new F();

  }
ログイン後にコピー

object() 関数が実際に行うことは 1 つだけです。それは、子オブジェクトのプロトタイプ属性を親オブジェクトにポイントし、それによって子オブジェクトと親オブジェクトを接続することです。

それを使用する場合、最初のステップは、親オブジェクトに基づいて子オブジェクトを生成することです:

var Doctor = object(Chinese);
ログイン後にコピー

次に、子オブジェクト自体の属性を追加します:

Doctor.career = '医生';
ログイン後にコピー

この時点で、子オブジェクトは次の属性を継承しています。親オブジェクト。

alert(Doctor.nation); //中国
ログイン後にコピー

3. 浅いコピー

「プロトタイプチェーン」を使う以外にも、親オブジェクトの属性をすべて子オブジェクトにコピーするという考え方もあります。

次の関数はコピーを作成しています:


  function extendCopy(p) {

    var c = {};

    for (var i in p) {
      c[i] = p[i];
    }

    c.uber = p;

 return c; }
ログイン後にコピー

使用する場合は次のように記述します:

var Doctor = extendCopy(Chinese);
Doctor.career = '医生';
alert(Doctor.nation); // 中国
ログイン後にコピー

しかし、このようなコピーには問題があります。つまり、親オブジェクトのプロパティが配列または別のオブジェクトと等しい場合、実際には、子オブジェクトが取得するのはメモリ アドレスのみであり、実際のコピーではないため、親オブジェクトが改ざんされました。

ご覧ください。中国語に「出生地」属性を追加します。その値は配列です。

Chinese.birthPlaces = ['北京','上海','香港'];
ログイン後にコピー

extendCopy() 関数を通じて、Doctor は中国語を継承します。

var Doctor = extendCopy(Chinese);
ログイン後にコピー

次に、ドクターの「出身地」の都市を追加します:

Doctor.birthPlaces.push('厦门');
ログイン後にコピー

何が起こったのですか?中国人の「出身地」も変わった!

alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
alert(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
ログイン後にコピー

したがって、extendCopy() は基本的なタイプのデータのみをコピーします。このコピーを「浅いコピー」と呼びます。これは、初期の jQuery で継承が実装された方法です。

4. ディープコピー

いわゆる「ディープコピー」とは、本当の意味で配列やオブジェクトをコピーする機能です。実装は難しくなく、「浅いコピー」を再帰的に呼び出すだけです。


  function deepCopy(p, c) {

    var c = c || {};

    for (var i in p) {

      if (typeof p[i] === 'object') {

        c[i] = (p[i].constructor === Array) ? [] : {};

        deepCopy(p[i], c[i]);

      } else {

         c[i] = p[i];

      }
}

    return c; }
ログイン後にコピー

使用するときは、次のように記述します:

var Doctor = deepCopy(Chinese);
ログイン後にコピー

次に、値を配列として親オブジェクトに属性を追加します。次に、子オブジェクトのこの属性を変更します:

Chinese.birthPlaces = ['北京','上海','香港'];
Doctor.birthPlaces.push('厦门');
ログイン後にコピー

この時点では、親オブジェクトは影響を受けません。

alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
alert(Chinese.birthPlaces); //北京, 上海, 香港
ログイン後にコピー

現在、jQuery ライブラリはこの継承方法を使用しています。

以上がJavascriptの非コンストラクタ継承例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!