1.概述
Reflect 物件與 Proxy 物件一樣,也是 ES6 為了操作物件而提供的新 API。Reflect 物件的設計目的有這樣幾個。
(1)將 Object 物件的一些明顯屬於語言內部的方法(比如 Object.defineProperty ),放到 Reflect 物件上。現階段,某些方法同時在 Object 和 Reflect 物件上部署,未來的新方法將只部署在 Reflect 物件上。也就是說,從 Reflect 物件上可以拿到語言內部的方法。
(2)修改某些 Object 方法的返回結果,讓其變得更合理。比如 Object.defineProperty(obj, name, desc) 在無法定義屬性時,會丟擲一個錯誤,而 Reflect.defineProperty(obj, name, desc) 則會返回 false 。
(3)讓 Object 操作都變成函式行為。某些 Object 操作是命令式,比如 name in obj 和 delete obj[name] ,而 Reflect.has(obj, name) 和 Reflect.deleteProperty(obj, name) 讓它們變成了函式行為。
(4)Reflect 物件的方法與 Proxy 物件的方法一一對應,只要是 Proxy 物件的方法,就能在 Reflect 物件上找到對應的方法。這就讓 Proxy 物件可以方便地呼叫對應的 Reflect 方法,完成預設行為,作為修改行為的基礎。也就是說,不管 Proxy 怎麼修改預設行為,你總可以在 Reflect 上獲取預設行為。