Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【AngularJS】既存のServiceを拡張した派生Serviceを定義する

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オブジェクトを結合しています。
両者が同じプロパティを保つ場合、派生側で上書きされるようにしました。

両者は継承関係にあるとは言えないので、派生という言い方も微妙かもしれません。。。