メソッドチェーンと返り値の型の制御を両立できない
Javascript で、classの作成をしています。
クラス内のメソッドを実行すると、配列が返される状態です。
したいことは以下の二つです。片方ずつならできるものの、両立ができずに悩んでいます。
①メソッドチェーンを行う
②console.log()で出力した際に、Array型で出力させる。
Javascript
1/* 2例として、+-5歳の年齢を返す(10歳なら、5~15)メソッドを作成します。 3*/ 4class Person{ 5 constructor(name, age){ 6 this.name = name; 7 this.age = age; 8} 9 nearly_years_old(){ 10 const youngest = this.age - 5; 11 const oldest = this.age +5; 12 const out = new Array(); 13 for(let i=youngest;i<=oldest;i++){ 14 out.push(i); 15 } 16 return out; 17 } 18/* 19以下に、チェーン用のメソッドが他かにもいくつか記載されていると仮定します。 20*/ 21}
上記のソースコードであれば、『② Array型で出力』は可能です。
しかし①ができないため、メソッドチェーンを行うために、
return out
を、return this
に変えたところ(thisを返す前に、this.nearly_years_olds = out
としています。)、戻り値がArrayではなくObjectになりました。
このため、メソッドチェーンをすると返り値が違い、返り値を制御するとメソッドチェーンができない、という状況になってしまっています。
「そもそも、そう言ったことができるのか」という疑問ですが、Array.length
を想定してみると、可能だろう、と考えています。
console.log(arr). /** @type {arr<array>} */
では、arrが配列形式で出力されます。
しかし、console.log(arr.length)
とすると、オブジェクトのような挙動(lengthプロパティを持っている)をします。
これを自作できないか、というのが質問の趣旨です。
もちろん、返り値のオブジェクトに対して、データが入ったプロパティを指定させることで解決自体はできますが、煩雑なコードを避けたいため、質問しました。
回答4件