2016-08-27 101 views

回答

9

反映和代理有完全不同的目的和不同的能力。

MDN describes Proxy in that way

Proxy對象用於定義基本操作(例如屬性查找,分配,枚舉函數調用等)自定義行爲。

And Reflect in that way

反映是一個內置的對象,它提供了可截取的JavaScript操作的方法。方法與proxy handlers相同。

我意識到你可能已經閱讀過,所以我將用一個例子來進一步解釋它。

假設你有一個對象:

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

可以使用屬性訪問器這樣的訪問屬性a

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

你可以做同樣的使用Reflect.get()方法:

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

您也可以使用該對象創建該對象的代理代理構造函數。我們將使用get處理程序截取所有屬性查找。

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

現在,使用任一屬性訪問器或Reflect.get()得到字符串'default'未定義的屬性結果:

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

代理與反思可以工作的偉大在一起。例如,您可以使用反射功能創建一個代理程序,其中包含空操作程序get處理程序:

new Proxy(obj, { 
    get: Reflect.get, 
}); 
相關問題