hirosejn / HJN

TAT log Diver
https://hirosejn.github.io/HJN/dist/tatLogDiver.min.html
0 stars 0 forks source link

時系列(timeSeries)データ分析機能の独立(リファクタリング) #75

Closed hirosejn closed 6 years ago

hirosejn commented 6 years ago

tat分析機能の独立(リファクタリング

[x] timeSeries フォルダ作成、timeSeries-tat.js分離 [x] tatからseriesSet取得機能(Graphから移植) [x] conc最大値取得 [x] 期間指定機能 (timeSeries-ETat.js分離)

対応見送り

[x] フィルター機能、上段表示用Menu / Filter 用HTML編集処理を移植( #74 使用)  fileReaderとの結合度のほうが高いため timeSeriesには含めない [x] 下段表示用Menu / Bottom detail graph 編集処理を移植( #74 使用)  Menu/Graphと密結合な機能のため tatLogDiver-Plot.js にファイル分割で十分

関連

前提 #74

hirosejn commented 6 years ago

Arrayを継承したETatの作成

要件

  1. ie11で動作すること
  2. 百万件クラスをArrayを普通に使うので、Arrayより性能劣化しないこと (Array要素へのアクセスで、プロトタイプチェーンが発生しないこと)
  3. Arrayの挙動(コンストラクタ、メソッド)を継承し、属性、メソッドを追加できること
    a=new Array(1,2,3); a.push(4,5,6); a // [object Array][1, 2, 3, 4, 5, 6]

    採用方式

    コンストラクタをArrayに移譲、オブジェクト毎にメソッド追加👍

    function eTat(){
    var arr = Array.apply(this, arguments);
    arr.hoge = function(){return this;};  // メソッド追加
    arr.fuga = "FUGA"; // プロパティ追加
    return arr
    };
    a=new eTat(1,2,3); a.push(4,5,6); a // [object Array][1, 2, 3, 4, 5, 6]
    a.fuga; // "FUGA"

    検討経緯

    prototype継承では、Arrayのコンストラクタは継承されない

    • ボツ案1
    • Arrayのコンストラクタの引数が効かない(自作クラスは効く)
    • Arrayのメソッドが使えるObjectだが、Arrayの一種ではない
      
      function inherits(sub, sup) {
      sub.super_ = sup;
      var F = function F () {};
      F.prototype = sup.prototype;
      sub.prototype = new F();
      sub.prototype.constructor = sub;
      };
      function eTat(){};
      inherits(eTat, Array);

a=new eTat(1,2,3); a.push(4,5,6); a // [object Object]{0: 4, 1: 5, 2: 6, @@hasInstance: undefined, @@isConcatSpreadable: undefined, @@match: undefined, @@replace: undefined, @@search: undefined, @@species: undefined, @@split: undefined, @@toPrimitive: undefined, @@toStringTag: undefined, @@unscopables: undefined, length: 3}

- ボツ案2
  - Arrayのコンストラクタの引数が効かない(自作クラスは効く)

function eTat(){ Array.apply(this,arguments); }; eTat.prototype = new Array();

a=new eTat(1,2,3); a.push(4,5,6); a // [object Object] [4, 5, 6]

#### ie11では、代表的な継承方法で使う以下のメソッドは使えない
1. extends

class ETat extends Array {}; e=new ETat(1,2,3); e.push(4,5,6); e // ETat(6) [1, 2, 3, 4, 5, 6]

2. Object.create

ETat.prototype = Object.create(Array.prototype, {}); ETat.prototype.constructor = ETat; e=new ETat(1,2,3); e.push(4,5,6); e // ETat(6) [1, 2, 3, 4, 5, 6]

3. Refrect

function ETat() { var eTat = Reflect.construct(Array, arguments, ETat); return eTat; } ETat.prototype = new Array(); e=new ETat(1,2,3); e.push(4,5,6); e // (6) [1, 2, 3, 4, 5, 6]



#### 参考
[クラスの落とし穴3 - 継承](https://qiita.com/cocottejs/items/e75f751c7aa8a7361aab)