? ? ? ?Reflect對象是ES6為了操作對象提供的新的API,它為了實現將object對象上的一些明顯屬于語言內部的方法放到Reflect對象上;修改某些Object的方法的返回結果,讓其變得更加合理(即減少報錯);讓object操作都變成函數行為;Reflect對象的方法和Proxy對象的方法一一對應,這讓proxy的修改默認操作有了基礎,即使修改了Proxy的默認行為也可以從reflect上獲取默認行為。
? ? ? ? Reflect對象的靜態方法:Reflect.get(target,name,receiver)查找返回target的name屬性,如果沒有該屬性則返回undefined,如果name屬性部署了讀取函數則讀取函數this綁定receiver,如果第一個參數不是對象那么報錯;Reflect.set(target,name,value,receiver)設置target的name屬性為value,如果name屬性設置了賦值函數那么this綁定receiver,如果第一個參數不是對象那么報錯;Reflect.has(obj,name)對應name in obj里的in運算符,如果第一個參數不是對象報錯;Reflect.deleteProperty(obj,name)等同于delete obj[name],用于刪除對象屬性,如果刪除成功或者被刪除的屬性不存在那么返回true否則返回false;Reflect.construct(target,args)等同于new target(...args)提供一種不使用new方法來調用構造函數;Reflect.getPropertyOf(obj)用來讀取對象的__proto__屬性,對應Object.getPropertyOf(obj),唯一不同的是Object.getPropertyof的參數不是對象的話會被轉化為對象,而Reflect對象就會報錯;Reflect.setPropertyOf(obj,newProto)設置對象的__proto__屬性,返回第一個參數對象,對應Object.setPropertyOf(obj,newProto),如果第一個參數不是對象Object.setPropertyOf(obj,newProto)返回都一個參數而Reflect報錯,如果第一個參數是undefined或者null那么都會報錯;Reflect.apply(func,thisArg,args)等同于Function.prototype.apply.call(func,thisArg,args)用于綁定this對象后執行給定的函數,一般來說如果要綁定一個函數的this對象可以寫成fn.apply(obj,args) ,如果函數定義了自己的apply方法了只能寫成Function.prototype.apply.call(fn,obj,args);Reflect.defineProperty(target,propertyKey,attribute)等同于Object.defineProperty用來定義對象屬性,第一個參數不是對象那么就會報錯;Reflect.getOwnPropertyDescriptor(target,propertyKey)等同于Object.getOwnPropertyDescriptor用來得到指定屬性的描述對象,唯一的區別是如果第一個參數不是對象的話Object.getOwnPropertyDescriptor返回undefined,而reflect報錯表示參數非法;Reflect.isExtensible(target)相當于Object.isExtensible返回一個布爾值表示當前對象是否可擴展,唯一的區別是Object.isExtensible的參數不是對象那么返回false,而Reflect報錯;Reflect.preventExtensions(target)對應Object.preventExtensions,用于使一個對象不可擴展,返回一個布爾值表示是否操作成功,如果參數書不是對象Object.preventExtensions在ES5報錯在ES6返回參數本身而Reflect報錯;Reflect.ownkeys(target)返回對象的所有屬性。