「Composition over inheritance」とも言われているように、オブジェクト指向では、無為に継承を行うよりも、Compositionのように「何ができるか」という役割を親クラスに追加していくほうが好ましいと言われています。
今回は、javascriptのコンストラクタ関数に、Object.assign()を使用して、Composition的にprototype拡張する方法をご紹介します。
Object.assign()とは?
1 2 3 4 5 6 7 |
const aaa = { a: 1, b: 2 }; const ccc = { c: 3 }; const ddd = { d: 4 }; Object.assign(aaa, ccc, ddd); console.log(aaa); // { a: 1, b: 2, c: 3, d: 4 } |
そもそも、Object.assign()とは、上記の例のように、ターゲットとされるオブジェクト(第一引数)に他のObjectをassignするために使用されます。
このObject.assign()を利用して、コンストラクタ関数をprototype拡張していきます。
Object.assign()を使って、prototype拡張する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
const drive = { doDrive() { console.log("drive"); } }; const stop = { doStop() { console.log("stop"); } }; function Car() { this.color = 'red'; this.showColor = function() { console.log(this.color); } } Object.assign(Car.prototype, drive, stop); const car = new Car(); console.log(car.color); // red car.doDrive(); // drive car.doStop(); // stop |
上記のコードのように、Car.prototypeに対して、drive, stopというオブジェクトをアサインすることで、Car()というコンストラクタ関数のprototypeにdoDriveメソッドとdoStopメソッドを追加できます。
このような形でコンストラクタ関数に後からObjectをassignすることで、コンストラクタ関数をprototype拡張していくことが可能です!