以下の内容はhttps://let.blog.jp/tag/functionより取得しました。


関数とクラスの置き換え
関数を受け取る関数があって それに渡す関数は特定のプロパティを持つオブジェクト返す必要がある場合

const fn = () => {
const fn1 = () => {}
const fn2 = () => {}
const value1 = 1
const value2 = 2
return { fn1, fn2, value1, value2 }
}

xxx(fn)

という感じ
クラス好きならオブジェクトは new で作ったインスタンスにすればいい

const Class = class {
fn1() {}
fn2() {}
value1 = 1
value2 = 2
}

xxx(() => new Class())

そのまま Class を渡しても new で呼び出してくれないので関数でラップしてる
オブジェクトのプロパティが関数の場合に メソッドのコンテキストで呼び出される保証がないなら this を bind するため代入形式にする

const Class = class {
fn1 = () => {}
fn2 = () => {}
value1 = 1
value2 = 2
}

xxx(() => new Class())



逆にクラスを受け取る関数の場合

const Class = class {
fn1() {}
value1 = 1
}

yyy(Class)

が通常形
関数にしたければ

const fn = () => {
const fn1 = () => {}
const value1 = 1
return { fn1, value1 }
}

const Class = function() {
return fn()
}

yyy(Class)

通常の関数はすべてアロー関数にしたいので fn はアロー関数
ただクラスとして扱うためには prototype が必要なので function で作った関数でラップする

独立したオブジェクトになるので instanceof が中で使われると正しく判定できない
instanceof に対応させる必要があるなら prototype チェーンをつなぐ

const fn = () => {
const fn1 = () => {}
const value1 = 1
return { fn1, value1 }
}

const Class = function() {
const ret = fn()
ret.__proto__ = Class.prototype
return ret
}

yyy(Class)
メソッドをstatic 関数化
const handler = (ctx, name) => (...args) => ctx.prototype[name].call(...args)
const S = ctor => new Proxy(ctor, { get: handler })

使用例

S(Array).reverse([1, 2, 3])
// [3, 2, 1]

S(String).slice("foobar", 2, 4)
// ob

パイプライン演算子が来たりでもないと基本はメソッドで良さそう
数少ない役立つところは map などの関数に入れる使い方

const SString = S(String)
const texts = [" a ", " b"].map(SString.trim)
// ["a", "b"]

毎回 「x => x.trim()」 って書くの疲れるし
文字数的にはそんなにだけど記号打つのが面倒

この方法だと prototype のメソッドを call するのと一緒なのでキャストされる
配列風なものを配列として扱いたいとかでは使えるけど 変換いらずにただその名前のメソッドを呼び出せればいいならこれで十分そう

const handler = (ctx, name) => (value, ...args) => value[name](...args)
const X = new Proxy({}, { get: handler })

const texts = [" a ", " b"].map(X.trim)
// ["a", "b"]

X.trim が引数の trim を呼び出す関数になるなら
parseInt(X, 2) で X のところに引数が入って呼び出される関数にもなってほしい
parseInt そのままではただの関数呼び出しに X が渡されるだけなので一工夫する

const handler = (ctx, name) => (value, ...args) => value[name](...args)
const fn = f => (...args) => a => f(...args.map(x => x === X ? a : x))
const X = new Proxy(fn, { get: handler })

X に関数を渡して その返り値を関数として使う

const hex2dec = X(parseInt)(X, 16)
hex2dec("ff")
// 255

const bit = X(Math.pow)(2, X)
bit(16)
// 65536

見やすさはなんかいまいち
やっぱり構文として対応してほしい
けど PHP では提案があったけど複雑すぎるとかで却下された話を聞いたし JavaScript でも入らなそうな気はする

少し長くなるけどアロー関数でできるといえばできるし 関数本体部分でちゃんと呼び出し形式になっていてどう実行されるかがわかりやすいし

X => parseInt(X, 2)
X => X.trim()



以上の内容はhttps://let.blog.jp/tag/functionより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14