関数型で内部のプリミティブな変数をプロパティとして取り出したい
関数型オブジェクトの内部変数を、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
にすればいいのではと言われればその通りですが、今回は関数型にこだわってみました。
回答5件
あなたの回答
tips
プレビュー