◆ Proxy 使って値をラップする
◆ get トラップで取得したプロパティのラップ済みの値を返す
◆ 関数として呼び出すと 引数がなければラップした値を取り出し
◆ 引数ある場合は 関数 引数2 引数3 … という形式で第一引数の関数を実行
  ◆ ラップした値が第一引数 
◆ プロパティ取得のときにメソッド呼び出しなのかプロパティ取り出しなのかの判断ができないので 存在しないメソッド呼び出しがプロパティに対して 関数適用か値取り出しになってしまう

前にもやってた undefined が入ってもメソッドチェーンする方法
Proxy 使ってプロパティでもできるようになりました



こんな感じで使えます
l(document.querySelector("#not-exist-elem")).appendChild(document.createElement("span"))
// 何も起きない

l(document.querySelector("#exist-elem")).appendChild(document.createElement("span"))
// 要素が追加される

l("a1c").match(/a(.)c/)[1](parseInt)()
// 1

l("a").match(/a(.)c/)[1](parseInt)()
// NaN

!function(){
function add(a,b){return a + b}
console.log(l(10)(add, 5)())
}()
// 15

引数なしの関数呼び出しでラップしてる値を取り出します
また 引数があれば一つ目の引数の関数を ラップされてる値と 2 つ目以降の引数を使って実行します

ただ 存在しないメソッドを呼び出したときに 関数じゃないプロパティに対して中身を取り出す操作をしてしまうことがあるので一部問題ありです
l([1,2,3]).pop()()
// 3

l().pop()
// undefined

上のように ()() とするとエラーになります

でも関数呼び出しで中身を取り出すというのは変えたくないので難しいところです