2011-01-29 15 views
0
var o = new SomethingComplex; 

var o.foo = new SomeThing; // we have o.foo.doSomething 

setUpForwarding(o, o.foo); 

o.doSomething(); // calls o.doSomething if exist, else o.foo.doSomething 

控えめなメソッド転送を設定するにはどうすればよいですか? ES5のテクニックを使うのは大丈夫です。私はこれがIE6では不可能だと想像することができます控えめなメソッド転送を実装する方法は?

私はそれが完全に邪魔にならないようにしたいと思っています。o.call("doSomething");

また、.__proto__を編集すると、プロトタイプチェーンにo.fooを投げることが不正行為であり、許可されません。本来のプロトタイプチェーンでoo.fooで上書きすることはできますが、oは複雑さに制限されません。

実行可能なオプションはありますか?

node-proxyの存在を覚えているので、node.jsを拡張してプロキシを実装することができます(C++で実装されています)。これはキャッチオール機能を提供し、おそらく他のSS JSに移植することができます。

+0

動的である必要がありますか?それ以外の場合は、 "o"を変更して "o.foo"のすべてのプロパティをマージするだけではどうですか? – Pointy

+0

@Pointy私は構成を避けたいが、集約と転送を使いたい。私がアグリゲーションと転送を使用している場合は、代わりにコンポジションを使用する必要があり、それは匂いだと言えます。 – Raynos

答えて

0

JavaScriptは将来のバージョンで考慮されていますが、「すべてを捕まえる」ハンドラはありません。

この特定の問題は、setUpForwardingのすべての機能メンバーを繰り返し処理して、oに同じ名前の転送機能を作成することで解決できます。しかしこれは機能のためだけに働くでしょう。

+0

では、ES5の 'Object.defineProperty'で簡単にプロパティを転送できます。私は私ができる素晴らしいことがあることを願っていました。また、 '.__ noSuchMethod__'の使用はmozで可能です。 – Raynos

関連する問題