このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

インターセプトとデレゲーション

id:nak2kさんのおかげで、advice.js(昨日の話)は、大域スコープまわりのゴタゴタがなくなってスッキリしました。

ところで、advice.jsの方法には問題があります。

関数の名前を乗っ取ること(インターセプト)によって、一種の“なりすまし”を行うのですが、実行コードだけをすり替えるわけではなくて、関数オブジェクト全体を置き換えます。他の言語では、「関数=実行コード」と思ってもいいのですが、JavaScriptではそうはいきません。

[追記] 以下、話がなんか混乱している。)

たとえば関数funcに、func.CONST_Aのような定数が定義されていると、偽物にはCONST_Aがないのでマズイことになります。プロパティ検索の際に、__proto__と同様なデレゲーション(検索リクエストの委譲)が明示的に指定できるといいのですが、そういう機能はありません。未知プロパティではwatchもできないし、、、Rubyのように、property_missingでもあればいいのだけど。

[追記] kilreyさんの助言により、再考の予定。)

もし、任意のデレゲーションができると、容易に循環参照が起きます。これをどう考えるかは価値観/主義の問題でしょう:

  • そんなことは危なすぎるからダメだ。
  • 使う側の自己責任で危険を回避すればよい。

なんか、「子供に鉛筆削りのナイフを持たせるか?」って話みたい。