2016-04-02 6 views
2

私がES6プロキシについて読んでいたとき、私がthis exampleを見るまで、それは理解するのが簡単だったようでした。アイデンティティを保持する膜プロキシーのユースケースは何ですか?

私は困惑しています。私は彼らが使っている "湿った/乾燥した"用語を理解していないし、これが理想的な選択である場合、特に私が見つけられないように見える場合にはいつ終わるか分からない。

誰かが、これが起こるシナリオの種類について簡単に説明できますか?

+0

あなたのリンクにアクセスできないようです。あなたはこの例のバックアップを持っていますか? – nils

+0

元のページはもう見つかりませんが、これはA-19ページにあります。http://soft.vub.ac.be/Publications/2012/vub-soft-tr-12-03.pdf – kpimov

答えて

5

まず、基本的なことを少し説明します。オブジェクトはプロパティのコレクションです(一部は機能であり、正式に「メソッド」と呼ばれます)。これは明白かもしれませんが、重要なのはオブジェクトとプロパティ名による他の値を参照することです。

プロキシを使用すると、(包含する)オブジェクトのタプルとプロパティ名によって他の値を参照するためのルールを書き換えることができます。たとえば、プロキシの背後にある「プライベート」メンバーを非表示にすることができます。

しかし、循環オブジェクト参照があるとします。例えば、

var x = { z: function() { throw new Error("This shouldn't be callable"); }; 
var X = /* proxy representing x, where X.z is hidden and cannot be called */; 

var y = { x: x }; 
x.y = y; 

またはdocument.documentElement.ownerDocument ==ドキュメントです。

通常のプロキシでは、X.yを参照するとyが返されます。そのXYX === xとXYX除く...そこは本当に何も間違っていない== X.だから私はまだ呼び出すことができます!

X.y.x.z(); // throws new Error("This shouldn't be callable") 

膜がすべて確認非プリミティブプロパティ(オブジェクトということについてであり、関数)は、このアイデンティティー関係を保持し、プロパティールックアップの任意の組み合わせによって、保持していたプロキシールールを維持します。メンブレンを使用すると、誤ってさまざまなオブジェクトの基になる(おそらくネイティブな)実装に直接アクセスすることを防ぐことができます。

Xがxの膜に基づくプロキシであった場合、X.yはでなく、 return yとなります。代わりに、Yのプロキシを返します。これはYと呼ばれます.Yは、Xのプロパティを公開するのと同じように、yのプロパティを公開します。

より重要なことに、私はX.y.xを参照とします

X.y.x === X; // true 
X.y.x !== x; // also true 
typeof X.y.x.z // returns "undefined", not "function" 
X.y.x.z(); // throws TypeError("X.y.x.z is not a function") 

X(Xのプロキシ)への参照が膜を通って戻されます。したがって、IDプロパティは保持されます。 (x.y.x === x、X.y.x === X.)

これは、最も重要な概念です。メンブレンとは、元のオブジェクトを見ることができないことを意味し、元のオブジェクトを表すことはできません。 Tom van Cutsem's articles on JavaScript Membranes

var X = (function() { 
    var x = { z: function() { throw new Error("This shouldn't be callable"); }; 
    var y = { x: x }; 
    x.y = y; 

    var X = /* membrane proxy representing x, where X.z is hidden and cannot be called */; 
    return X; 
})(); 

X.y.x === X; // still true 

、XまたはYを介して呼ばれるものがの一部であろうしながらcited above、値X、Y、及びXZは全て、「湿式」オブジェクトグラフの一部と考えられるその一方"乾燥した"オブジェクトグラフ。 (グラフという用語はグラフ理論からのもので、離散数学の研究の一部であり、オブジェクトグラフは関連オブジェクトの集合を意味し、メンブレンは「ネイティブ」オブジェクトのセットをプロキシセットからそれらのオブジェクトに分離するものです。 )

xとyの値は、関数の外から直接にアクセスできないです。(JavaScriptの言い方では、この例ではローカル変数ですが、それは膜の観点から部分的に誤解を招きます.DOMドキュメントについて話していた場合、Mozilla FirefoxのようなWebブラウザで実際に何を得ているのかは、 DOMドキュメントではなく、ネイティブメモリからの実際のドキュメントオブジェクトです。ローカル変数でも、実行中のJavaScriptのスコープに挿入された値でも、メンブレンとそのプロキシは気にしません)。

代わりに、 x、y、およびそのプロパティは、Xの膜プロキシと、Xから取得するすべてのプロパティを経由しなければなりません。膜であるため、そのアクセスは常に間接的です。

これが起こるシナリオとしては、コンピュータのファイルシステムにアクセスするなど、あらゆる種類の処理を実行できる信頼できるコードがあるとします。あなたは、Webページがファイルシステムから直接読めるようにしたり、悪化したりすることはできません。プロキシのメンバは、公開するプロパティとメソッドを公開するだけで、Webページが使用できるAPIを減らすので、その信頼できるコードへの偶発的なアクセスは非常に少なくなります。これにより、セキュリティの悪用が非常に少なくなります。

最も良いことは、メンブレンの実装が正しい場合(音よりはるかに難しい)、ウェブページJavaScriptがプロキシを処理していることを知らない、または気にしないことです。ウェブページのスクリプトは、それが普通のDOMを扱っていると考えています。それが私たちが望むものです。

関連する問題