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上獲取預設行為
1和2條的例子
// 舊寫法
trycatch
(e)// 新寫法
if(reflect.
defineproperty
(target,property,attributes)
)else
3條的例子
// 舊寫法
console.
log(
'assign'
in object)
;// 新寫法
console.
log(reflect.
has(object,
'assign'))
;
4條的例子
const
= reflect;
proxy
(target,
return success;}}
)
**中,proxy方法攔截target物件的屬性賦值行為。
它採用reflect.set方法將值賦給物件的屬性,確保完成原有的行為,然後再部署額外的功能
let loggedobj =
newproxy
(obj,
,deleteproperty
(target,name)
,has
(target,name)
})
上面的**中,m每乙個proxy物件的攔截操作(get,delete,has)內部都呼叫對應的reflect方法,保證原生行為能正常執行,新增的工作就是將每乙個操作輸出乙個日誌
有了reflect物件,很多操作更易讀
// 舊寫法
console.
logcall
(math.floor,undefined,[1
,75])
);// 新寫法
console.
log(reflect.
(math.floor,undefined,[1
,75])
);
ES6個人筆記記錄 Symbol
es5 的物件屬性名都是字串,這容易造成屬性名的衝突 比如,我們使用了乙個他人提供的物件,但又想為這個物件新增新的方法cmixin 模式 新方法的名字就有可能與現有方法產生衝突。es6引入了一種新的原始資料型別symbol,表示獨一無二的值 是第七種資料型別 1.number 2.string 3....
ES6個人筆記記錄 陣列擴充套件
擴充套件運算子 console.log 1,2,3,4 5 es5 console.log math.max.null,14,2,48 es6 let math console.log max 14,2,48 es5 var arr1 0 1,2 var arr2 3 4,5 console.log...
ES6個人筆記記錄 Proxy2
1.getlet person let proxy1 newproxy person,else console.log proxy1.name,proxy1.age get方法可以被繼承 let proto newproxy const object const reflect let obj1 c...