関数型で内部のプリミティブな変数をプロパティとして取り出したい
関数型オブジェクトの内部変数を、getter のように () を付けずに取り出したいと考えています。
get アクセサを使えば良いのですが、もっと簡潔な方法はないかと考えています。
js
1obj.hoge(); // ではなく 2obj.hoge; // という感じ
失敗する例
カウンターを例に作成しました。
下記の例では counter.add() を実行しても counter.count が更新されることはありません。
count はプリミティブな変数なので useCounter() 実行時の値が固定されているためです。
js
1const useCounter = (num) => { 2 let count = num; 3 4 const add = () => { 5 count += 1; 6 }; 7 8 return {add, count}; 9}; 10 11const counter = useCounter(0); 12 13counter.add() 14console.log(counter.count); // 0 15counter.add() 16console.log(counter.count); // 0
関数で取り出す
関数を作って取り出せばもちろん問題ありません。
js
1const useCounter = (num) => { 2 let $_count = num; 3 4 const add = () => { 5 $_count += 1; 6 }; 7 const getCount = () => { 8 return $_count; 9 }; 10 11 return {add, getCount}; 12}; 13 14const counter = useCounter(0); 15 16counter.add() 17console.log(counter.getCount()); // 1
getter を使う
useCount() が返すのはオブジェクトなので get アクセサを使いました。
これは希望通りの結果になります。
しかし変数が増えると get xxx(){} も増えるのが難点です(これは一つ前の例でも同様です)。
js
1const useCounter = (num) => { 2 let $_count = num; 3 4 const add = () => { 5 $_count += 1; 6 }; 7 8 return { 9 add, 10 get count(){ return $_count; } 11 }; 12}; 13 14const counter = useCounter(0); 15 16counter.add() 17console.log(counter.count) // 1;
何か良い方法は無いでしょうか?
Class にすればいいのではと言われればその通りですが、今回は関数型にこだわってみました。
> 今回は関数型にこだわってみました。
何かこだわらなければならない背景はある状況でしょうか?
アロー関数ってthisが使えないんですよね。
>maisumakun 様
既存の class をリファクタリングしている時に
・private なメソッド、プロパティを明確にしたい
・this書くの面倒くさい
という理由から関数型にしました。
関数型という表現は良くないですね。
関数=functionだとthisが使えるので意図が180度違う形で伝わってしまっています。
>dameo 様
ご指摘ありがとうございます。確かにその通りですね。
名称を知らないのですが、なんと表現すればいいでしょうか?
function禁止でアロー関数のみとするか、thisを使用しない!を条件に入れればいいと思いますよ。
> private なメソッド、プロパティを明確にしたい
今のclassにはprivate機能があります。
>maisumakun 様
頭に#をつけるってやつでしょうか?
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/Private_class_fields
回答5件
あなたの回答
tips
プレビュー