2016-08-27 11 views
6

ReflectProxyの間に有意差はありますか?ProxyコンストラクタとReflectの違いは何ですか?

文書化されているものから、彼らがほとんど同じ機能を持っているようだ、離れてから:

  • 一度に一つだけのトラップを指定することが可能な反映。
  • プロキシがrevocableである。
  • プロキシーがコンストラクターです。

上記のリストにすべての相違点がまとめられている場合は、その両方の理由がありますか?

答えて

9

ReflectとProxyはまったく異なる目的と機能を持っています。

MDN describes Proxy in that way

Proxyオブジェクトは、基本的な動作のためにカスタム動作(例えば、プロパティ・ルックアップ、割り当て、列挙、関数呼び出しなど)を定義するために使用されます。

And Reflect in that way

内蔵インターセプト可能のJavaScript操作するための方法を提供する目的で反映します。方法はproxy handlersと同じです。

すでに読んでいると思いますので、例を使用してさらに説明します。

const obj = { 
    a: 'foo', 
    b: 'bar', 
}; 

は、あなたがそのようなプロパティアクセサを使用して、プロパティaにアクセスすることができます:

console.log(Reflect.get(obj, 'a')); // 'foo' 

console.log(obj.a); // 'foo' 

は、あなたがそれを用いReflect.get()方法を行うことができます

のは、あなたがオブジェクトを持っているとしましょう

このオブジェクトのプロキシを作成するには、プロキシコンストラクタ。 getハンドラを使用して、すべてのプロパティ参照をインターセプトします。さて、文字列'default'で未定義のプロパティの結果を得るために、プロパティアクセサまたはReflect.get()のいずれかを使用して

const proxy = new Proxy(obj, { 
    get(target, property) { 
    return property in target ? target[property] : 'default'; 
    }, 
}); 

console.log(proxy.c); // 'default' 
console.log(Reflect.get(proxy, 'c')); // 'default' 

Proxyと一緒に素晴らしい仕事することができます反映します。たとえば、getハンドラのないプロキシを作成してReflect:

new Proxy(obj, { 
    get: Reflect.get, 
}); 
を使用してプロキシを作成することができます
関連する問題