ES6モードでの多重継承の実装

問題が発生します:

継承チェーンは次のとおりです。

ここに画像の説明を挿入
私のDogオブジェクトはAnimalクラスプロパティを実装していますがクラスも継承したいと思っていFriendlyます。共有属性を取得します。

問題が解決しました

実際、ES6クラスは多重継承を実装できません。この形式では多重継承を実現できません。インターネット上
ここに画像の説明を挿入
で多くのミックスミンのアイデアやアイデアを見つけ、ついにルアン・イフェン先生のブログで解決策見つけました:

function mix(...mixins) {
  class Mix {
    constructor() {
      for (let mixin of mixins) {
        copyProperties(this, new mixin()); // 拷贝实例属性
      }
    }
  }

  for (let mixin of mixins) {
    copyProperties(Mix, mixin); // 拷贝静态属性
    copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
  }

  return Mix;
}

function copyProperties(target, source) {
  for (let key of Reflect.ownKeys(source)) {
    if ( key !== 'constructor'
      && key !== 'prototype'
      && key !== 'name'
    ) {
      let desc = Object.getOwnPropertyDescriptor(source, key);
      Object.defineProperty(target, key, desc);
    }
  }
}

上記のコードを継承します。Dogクラスの宣言は簡単に実現できます

ここに画像の説明を挿入
テスト後、継承チェーン、属性チェーン、およびメソッドチェーンはすべて正常です。問題は1つだけで、super()関数が親クラスを呼び出すと、パラメーターを渡すことができません。上記のRuan氏のコードを次のように変更します。

  class Mix {
    constructor(...ags) {
      for (let mixin of mixins) {
        copyProperties(this, new mixin(ags)); // 拷贝实例属性
      }
    }
  }

テスト。すべてが正常です


フォローアップ補足:

実際の使用で、ミックス関数がプロトタイプチェーンをprototype再度コピーしたときに、ディープコピーを作成しなかったことがわかりました。つまりFriendly、クラスに上位の親クラスがある場合、Dog継承できないため、時間をかけて関数を変更します。

おすすめ

転載: blog.csdn.net/qq_29722281/article/details/96979042