AngularJSで既存のServiceが持つ機能を拡張させたServiceを定義したかったので、
以下のようにしてServiceを派生させてみました。
Service定義
"use strict"; // 基底Service(factory形式) angular.module('App') .factory('baseService',[ function(){ let service = { hoge: function(){ return 'hoge'; } }; return service; }]); // 派生Service angular.module('App') .factory('childService', [ 'baseService', function(baseService){ let service = { hoge: function(){ return 'hogehoge'; }, fuga: function(){ return 'fuga'; } }; // 二つのサービスを結合(基底サービスと一致するプロパティがある場合上書き) return Object.assign(Object.assign({}, baseService), service); }]);
実行
"use strict"; angular.module('App', []) .controller('MainController', [ 'childService', function(childService) { console.log(childService.hoge()); console.log(childService.fuga()); }]);
実行結果
hogehoge fuga
いわゆるコンポジット(プロパティではないので多分違いますが)のような形に落ち着きました。
派生Service内の実行関数の引数として基底Serviceをとり、基底Serviceで定義したserviceオブジェクトと、
派生Serviceで定義したserviceオブジェクトを結合しています。
両者が同じプロパティを保つ場合、派生側で上書きされるようにしました。
両者は継承関係にあるとは言えないので、派生という言い方も微妙かもしれません。。。