valueOf'が表示されたあと30が表示されるだろう。20というコードの中でvalueOfが呼ばれ、さらにその返り値の10がobjの値となっている。このvalueOfを定義しておくとJavaScriptのほとんどの演算子の呼び出し時に任意の関数を実行することができる。そのため、演算子オーバーロードのように見せるかけることができる、というわけだ。やってみるでは、実際にこのvalueOfを利用(悪用とも言う)して何か作ってみようと思う。今回作るのは、関数の合成演算子だ。関数の合成というのは数学と同じで、fとgという二つの関数があるときf(g(x))のように実行する関数を作ることだ。gのようにして演算子オーバーロードするイメージでいく。初めに、演算子のオーバーロードではない普通の関数として定義してみる。41当然これはただの関数で演算子には成り得ない。これをvalueOfを使って演算子オーバーロードしたように関数を合成できるようにするにはどうしたら良いだろうか?方法としては、FunctionオブジェクトのvalueOfメソッドを弄ればよいことになる。gのようなコードがあるときにvalueOfメソッドが呼ばれることになる。ここで一つ注意しなければいけないのが、valueOfメソッドがプリミティブな値を返さなければいけないということだ。gはオブジェクトである関数を直接返すことはできない。なると積んでしまったように思えるが、これには単に関数で包み込むなどすればそこまで問題ではない。それでは、実際に演算子オーバーロードのように見せかけるコードを書いてみる。41少しコードを解説すると、まずグローバルオブジェクトにcomposeというプロパティを定義している。このcomposeはゲッターを持っていて、そこで演算子オーバーロードのための準備をしている。その準備とは主に、Function.prototype.valueOfメソッドを書き換えることだ。関数が数値に変換されようとしたら、その関数を保存して適当な値を返している。次に、composeは実際に関数を合成するための関数を値として返している。保存した関数を右畳込みして合成する。Function.prototype.valueOfをバックアップしておいて、ここで戻すことで全体への影響を最小限にしている。*g)というのがこのcomposeの用例だ。gという式で関数が合成されているだろう。このとき、compose.callとしてcomposeを呼びださなければいけないのはJavaScriptが引数の方を先に評価するからだ。この演算子オーバーロードのようなcomposeの便利なところはさっきの関数のと違って二つ以上も簡単に合成できるところだ。g)と書き換えれば返ってくる値は82になるだろう。結びにこの演算子オーバーロードのように見せかける方法は、主に言語内DSLを構築するときに役に立つと思う。演算子の直感的な表記方法は魅力的だ。いくつかの説明(valueOfについてなど)を簡略化のために省略したので、一部正確でないところもある。それについてはここなどを参照してほしい。昨日に投稿した記事の読み方です。ツイート月別アーカイブはてなブログをはじめよう!alucky0707さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。