確定ではありませんが、ES6 Proxies を試しています。私の目標は、継承チェーンを持つプロキシ オブジェクトを作成するためのコンストラクター関数 (以下に示すような従来の継承を利用する関数) を持つことです。
function inherit(child, parent){ //a classical inheritance pattern
var F = function(){};
F.prototype = parent.prototype;
child.prototype = new F();
child.parent = parent.prototype;
child.prototype.constructor = child;
return child;
}
以下は賢明に見えますか?アイテムを作成し、コンストラクターからプロキシを返します。(連鎖の目的で) インスタンスへの参照を返すメソッドは、代わりにプロキシへの参照を返す必要があります。そうしないと、連鎖中にプロキシが失われます。
function Item(attrs){
this.attrs = attrs;
var proto = this.constructor.prototype;
return this.proxy = Proxy.create(new MyHandler(this), proto);
}
Item.prototype.setStatus = function(status){
//do work
return this.proxy; //we do this everywhere instead of a simple 'this'?
}
function DVD(attrs){
attrs.type = 'DVD';
return Item.call(this, attrs);
}
inherit(DVD, Item);
var negotiator = new DVD({title: 'The Negotiator'}); //returns proxy
目標は、('new' キーワードを介して) プロキシ化されたオブジェクトを構築することです。これは、従来の継承チェーンの製品である可能性があります。
次号。Item プロトタイプを Backbone.Events で拡張するとどうなるか考えてみてください。これらのインポートされたメソッドは、this
代わりに返されthis.proxy
ます。これを回避するにthis
は、代わりに を返すために、インポートされたすべてのメソッドをラップして返す必要がありproxy
ます。これは面倒でエラーが発生しやすいようです。Proxy の抽象化を利用するには多くの配線が必要ですが、これは私には適切ではないように思えます。
Proxy のコンセプトは気に入っていますが、その実用性に関心があります。たぶん、目標を達成するためのより良い練習が欠けているのでしょうか?
編集:
この例は単純化しすぎているため、なぜそれが必要なのかを説明できませんでした。
プロキシを使用する最終的な目標は、多重継承を可能にすることです。特定のプロキシ オブジェクトに複数の動作 (モジュール) をミックスインできるようにしたいと考えています。また、気まぐれに動作を簡単に分解できるようにしたいと考えています。
プロキシを使用することで、Proxy オブジェクトでメソッドへのアクセスを管理し、必要に応じて mixin に情報を渡すことができます。基本的に、これによりアスペクト指向プログラミングが改善されます。アスペクトでは、通常、関数をラップして置き換えます。場合によっては、特定のメソッドがいくつかの側面によってラップおよび再ラップされることがあります。AOP の問題点は、この方法でオブジェクトを変更すると、再ラップによってその側面が埋もれてしまう可能性があるため、その側面を 1 つだけ削除するのは容易ではないことです。
プロキシにはこの問題はありません。代わりに、ミックスインを配列に配置できます。プロキシは、これらの mixin で見つかったメソッドへのディスパッチを処理します (複数のメソッド、したがって複数の継承であっても)。その後、アンミックス動作は、その配列から mixin を削除するのと同じくらい簡単です。
プロキシの問題は、メソッドが (連鎖の目的で) オブジェクト自体への参照を返すことは一般的な方法ですが、元のメソッドのいずれかがそのオブジェクトへの参照を返すことを本当に望んでいないことです (したがって、バイパスプロキシ)、代わりにプロキシを返す必要があります。