

Hatena::Let
>Proxyカッコイイ
コンストラクタの場合、handeler.apply じゃなくて hander.construct があるのが 良いなあ
Hatena::Let
this を気にして使うんだったら、Reflect を使うのが正解、ってんじゃないような気がする。
target[prop] か、receiver[prop]なだけで。
getter/setter で、Proxy 自身が手に入る意味は分かったけど、これは難しいな。
Hatena::Let
>気になってる動作があるので、
Reflect.get の receiver とは、関係なかった。
XHR の responseText を改変したくて、こんなコードを書きました。
const xhr = new Proxy(original_xhr, {
get: (target, prop, receiver) => {
let v = target[prop];
if (prop === 'responseText') {
// prevent preload images.
v = v.replace(/<img src=/g, "<img data-src=");
}
return v;
},
});
この xhr は、後で getResponseHeader() が呼ばれるのですが、そこでこんなエラーが出ちゃう。
TypeError: 'getResponseHeader' called on an object that does not implement interface XMLHttpRequest.
まあ、メッセージの通りではあるんですが、こんなチェックが入っているんだなあ、と。
メソッドの getter も改変することになりました。
xhr = new Proxy(original_xhr, {
get: (target, prop, receiver) => {
let v = target[prop];
if (prop === 'responseText') {
// prevent preload images.
v = v.replace(/<img src=/g, "<img data-src=");
} else if (typeof(v) === "function") {
const method = v;
v = function() {
return method.apply(target, arguments);
};
}
return v;
},
});
# 不細工 (´・ω・`)
Hatena::Let
Hatena::Haiku::Search ってサービスがお亡くなりになって、やっぱり不便で、MutationObserver 使って、強制的に Auto Pagerize を発動させつつ、関係ない投稿を消し続けるという Bookmarklet を書いたことがありまして、そのときに ten-extras.js は ちょっと読んだことがあります。
MutationObserver を使ったやつは、Star の処理とかも入るのでかなり遅くって、速くしたいなあと思ってたんですが、この Proxy で Hook するのはかなり軽くできそうです :-)
はてなブログ
>ネックは、はてなスターとはてなキーワードな気がする。
はてなキーワードは、やっぱりというか http なままだ。
金を払ってキーワードリンクを無効にしろ、と。
ただ、[]https://d.hatena.ne.jp/[] が(status 200 とはいえ)Location: で []http://d.hatena.ne.jp[] に飛ばされているので、もしかしたらやる気になってるのかも知らん。
# リダイレクトは、前から?
で、全てのブログで使えるって?

# なんの地雷を踏んでいるんだか...
Hatena::Let
Reflect は、Proxy とペアで使うと、Proxy に指定するハンドラと引数が同じだから、気持ち良いよね、っていうことかな。
気持ちは、分からんでもない。
Hatena::Let
書いてみた。
http://let.hatelabo.jp/a-kuma3/let/hJmc2r6j5rMx
Auto Pagerize では、http://h.hatena.ne.jp/js/updu/ten-extras.js の TL.DataSource.TimelinePage.prototype.loadData で XHR でデータを取り、ひとつの投稿を TL.Entry というクラスにラップして、後の処理で一覧に埋め込んでる。
処理を横取りするところはいくつかあるけど、constructor を Hook してみたかったので、見せたくない投稿は内容を空にする、という処理をコンストラクタに埋め込んでみた。
apply は、名前通りの Proxy パターン以外にも、Decorator パターンとか、Chain of Responsibility パターンで使えそう。
どちらも、Function がグローバルスコープになってないとダメなので、今どきのパックされてるやつだと使えないかも、という気はしてるけれど、アドオンだったら、ちょっと違うかも(無理かな)。
Hatena::Let
Proxy は、Proxy じゃないとできないことがあるけれど、Reflect は、それがないとできないことがあるのかな、って。
何度か使ってみないと分からないかな
Hatena::Let
Extending Constructor むずかしい。
class の extends あるから、あくまでもサンプルなんでしょうが。
理解がおっつかないという意味での「お腹いっぱい」なので、既存のコードのすげ替えには便利なはず。
Proxy は、インスタンスが、元ネタと違うので、それを置き換えられれば、というところ。
constructor のすげ替えは、Proxy じゃないとできない(はず
Hatena::Let
この感じ、どこかで見たことがあると思ったら java.lang.reflect.Proxy か。
デザパタの Proxy というイメージがあまりなくて、これは Hook だ、と思った記憶が。
Hatena::Let
Proxy のサンプルだけでお腹いっぱい(というか、消化不良気味
Reflect の方は便利さがイマイチ分かってない。
リフレクションにあたるメソッドや構文が散らばってるので、集めてみました的な感じなのかな...