プライベート関数を置き換える黒魔術

id:hogelog さんが怪しげな事をやらかそうとしていたので唐突に思いついてみた。

ここでの目的は hints.js の onInput の中にオレオレ処理を追加する事。
しかし、onInput は所謂プライベート関数なので、普通にやっても書き換えたり参照することは出来ない。
そこで、liberator.eval を使う。

  // 対象のプライベート関数がみえるオブジェクトを使う
  let context = hints.addMode;
  // まずはオリジナルの関数を取得
  let onInput = liberator.eval('onInput', context);
  // 一時的に、context に突っ込みたい処理を書いた関数をぶち込む。
  context.__anekos_dummy_repvblika = function () {
    alert('neko neko!');
    return onInput.apply(this, arguments);
  }
  // オリジナルの関数を上書き
  liberator.eval('onInput = this.__anekos_dummy_repvblika', context);
  // 要らない子は削除!
  delete context.__anekos_dummy_repvblika;

名前が衝突しないように変態的にすると良いと思う。
発音すらよくわからないブラックメタルバンドの名前がオススメ。

文字列で完結すれば、

liberator.eval("onInput = funciton () alert('neko neko!')", context);

とでも出来るが意味はないだろう。
つか、もっと綺麗な方法無いかな。