id:nak2kさんのおかげで、advice.js(昨日の話)は、大域スコープまわりのゴタゴタがなくなってスッキリしました。
ところで、advice.jsの方法には問題があります。
関数の名前を乗っ取ること(インターセプト)によって、一種の“なりすまし”を行うのですが、実行コードだけをすり替えるわけではなくて、関数オブジェクト全体を置き換えます。他の言語では、「関数=実行コード」と思ってもいいのですが、JavaScriptではそうはいきません。
([追記] 以下、話がなんか混乱している。)
たとえば関数funcに、func.CONST_Aのような定数が定義されていると、偽物にはCONST_Aがないのでマズイことになります。プロパティ検索の際に、__proto__と同様なデレゲーション(検索リクエストの委譲)が明示的に指定できるといいのですが、そういう機能はありません。未知プロパティではwatchもできないし、、、Rubyのように、property_missingでもあればいいのだけど。
([追記] kilreyさんの助言により、再考の予定。)
もし、任意のデレゲーションができると、容易に循環参照が起きます。これをどう考えるかは価値観/主義の問題でしょう:
- そんなことは危なすぎるからダメだ。
- 使う側の自己責任で危険を回避すればよい。
なんか、「子供に鉛筆削りのナイフを持たせるか?」って話みたい。