Mixinモード
14010 ワード
紹介する
mixinモードとは、1つまたは複数のサブクラスに単純に継承される機能を提供するクラスであり、その機能を再利用することを意図している.対象に向けた言語では、インタフェース継承によって機能の多重化を実現します.しかし、javascriptではインタフェースを通じて継承することはできませんが、javascript特有のプロトタイプチェーン属性を通じて、機能をプロトタイプチェーンに引用してコピーし、機能の注入を達成します.
コードの実装
Mixinは一つのシステムにおける分解機能の重複をサポートし、機能の再使用性を増加させます.一部のアプリケーションでは、すべてのオブジェクトエンティティで動作を共有する必要があるかもしれません.Mixinでこの共有機能を維持することによって、任意の重複を回避しやすくなります.したがって、システムの中で本当に互いに異なる機能のみを実現することに専念します.
つまり、Mixinの副作用は議論に値するものであり、一部の開発者は機能を対象の原型に注入するのは悪いアイデアだと感じています.プロトタイプの汚染と一定の程度の機能に対する不確実性を同時にもたらすからです.
mixinモードとは、1つまたは複数のサブクラスに単純に継承される機能を提供するクラスであり、その機能を再利用することを意図している.対象に向けた言語では、インタフェース継承によって機能の多重化を実現します.しかし、javascriptではインタフェースを通じて継承することはできませんが、javascript特有のプロトタイプチェーン属性を通じて、機能をプロトタイプチェーンに引用してコピーし、機能の注入を達成します.
コードの実装
function Mixin(recClass, giveClass) {
if (arguments.length > 2) {
for (let i = 2; i < arguments.length; i++) {
recClass.prototype[arguments[i]] = giveClass.prototype[arguments[i]];
}
} else {
for (let property in giveClass.prototype) {
recClass.prototype[property] = giveClass.prototype[property];
}
}
};
実例 function Car(name, speed){
this.name = name;
this.speed = speed;
}
Car.prototype.now = function() {
console.log(this.name,this.speed);
}
Car.prototype.limit = function() {
console.log('speed limit 120km/h')
}
Car.prototype.drive = function() {
console.log('Car can drive');
}
function Future() {
}
Future.prototype.fly = function() {
console.log('Car can fly in future');
}
Future.prototype.limit = function() {
console.log('speed not limit');
}
var car = new Car('ferrari', 80);
car.now();
car.limit();
car.drive();
Mixin(Car, Future);
var carFuture = new Car('future', 200);
carFuture.now();
carFuture.limit();
carFuture.drive();
carFuture.fly();
//=>
// ferrari 80
// speed limit 120km/h
// Car can drive
// future 200
// speed not limit
// Car can drive
// Car can fly in future
Mixin(Car, Future, 'fly');
var car = new Car('ferrari', 80);
car.now();
car.limit();
car.drive();
Mixin(Car, Future);
var carFuture = new Car('future', 200);
carFuture.now();
carFuture.limit();
carFuture.drive();
carFuture.fly();
//=>
// ferrari 80
// speed limit 120km/h
// Car can drive
// future 200
// speed limit 120km/h
// Car can drive
// Car can fly in future
優劣比較Mixinは一つのシステムにおける分解機能の重複をサポートし、機能の再使用性を増加させます.一部のアプリケーションでは、すべてのオブジェクトエンティティで動作を共有する必要があるかもしれません.Mixinでこの共有機能を維持することによって、任意の重複を回避しやすくなります.したがって、システムの中で本当に互いに異なる機能のみを実現することに専念します.
つまり、Mixinの副作用は議論に値するものであり、一部の開発者は機能を対象の原型に注入するのは悪いアイデアだと感じています.プロトタイプの汚染と一定の程度の機能に対する不確実性を同時にもたらすからです.