問題が発生します:
継承チェーンは次のとおりです。
私の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
継承できないため、時間をかけて関数を変更します。