Reflect()和Proxy()一樣都是ES6給操縱對(duì)象提供的新API,原來(lái)的對(duì)象很多方法都是命令式的,不符合函數(shù)式編程思想,什么是函數(shù)式編程思想,以后有空再來(lái)談一下自己的理解。先看一個(gè)例子:
let person = {
name: 'zdf'
}
// 老寫(xiě)法(命令式)
'name' in person
// 打印
console.log('name' in person) // true
// 新寫(xiě)法(函數(shù)式)
Reflect.has(person , 'name')
// 打印
console.log(Reflect.has(person , 'name')) // true
- 命令式和函數(shù)式熟好熟劣我不敢做出決斷,只是個(gè)人覺(jué)得函數(shù)式的易讀性更好??偠灾瓻S6對(duì)命令式的方法都改進(jìn)成了函數(shù)式。
Reflect的set()實(shí)例
// 空對(duì)象
let person = { }
// Reflect賦值
Reflect.set(person, 'name', 'D')
Reflect.set(person, 'age', '18')
Reflect.set(person, 'job', 'RD')
// 賦值后查看
console.log(person) // => {name: "D", age: "18", job: "RD"}
-so easy吧!是不是簡(jiǎn)單易上手。
Reflect的get()實(shí)例
// 對(duì)象
let person = {
name: 'D',
age: '18'
job: 'RD'
}
// Reflect獲取
console.log(Reflect.get(person, 'name')) // => D
console.log(Reflect.get(person, 'age')) // => 18
console.log(Reflect.get(person, 'job')) // => RD
- 還能更簡(jiǎn)單嗎?
Reflect的has()實(shí)例
// 對(duì)象
let person = {
name: 'D',
age: '18'
job: 'RD'
}
// Reflect獲取
console.log(Reflect.has(person, 'name')) // => true
console.log(Reflect.has(person, 'age')) // => true
console.log(Reflect.has(person, 'job')) // => true
console.log(Reflect.has(person, 'sex')) // => false
- 是不是已經(jīng)有了jQuery的范范兒?
Reflect的deleteProperty()實(shí)例
// 對(duì)象
let person = {
name: 'D',
age: '18'
job: 'RD'
}
// Reflect刪除
Reflect.deleteProperty(person, 'name')
// 打印刪除后的person
console.log(person) // => {age: 18, job: "RD"}
- 刪除操作原先也是命令式的 delete obj.property,現(xiàn)在覺(jué)得那種好?
Reflect和Proxy的結(jié)合實(shí)例
let person = {
name: 'zdf'
}
// handler
let handler = {
set(target,name,value){
let success = Reflect.set(target, name, value)
if (success) {
console.log('屬性:' + name + ',值:' + value+ ',對(duì)象:' + target )
}
return success;
}
}
// Proxy
let proxy = new Proxy(person,handler)
proxy.name = '瘋子' // => 屬性:name,值:瘋子,對(duì)象:[object Object]
proxy.age = 18 // => 屬性:age,值:18,對(duì)象:[object Object]
console.log(person) // => { name: '瘋子', age: 18 }
- 上面的實(shí)例就是先使用Proxy()攔截賦值操作,然后使用Reflect()賦值給對(duì)象后再執(zhí)行其他操作。這樣就能保證完成原有的行為之后再做其他的騷操作。
- 是不是很奇怪怎么是Proxy()實(shí)例了?
- Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng),只要是Proxy對(duì)象的方法,就能在Reflect對(duì)象上找到對(duì)應(yīng)的方法。
- 這就讓Proxy對(duì)象可以方便地調(diào)用對(duì)應(yīng)的Reflect方法,完成默認(rèn)行為,作為修改行為的基礎(chǔ)。也就是說(shuō),不管Proxy怎么修改默認(rèn)行為,你總可以在Reflect上獲取默認(rèn)行為。
靜態(tài)方法匯總
可以一個(gè)一個(gè)自己去研究,我就不一一研究了。懶!
- Reflect.apply(target, thisArg, args)
- Reflect.construct(target, args)
- Reflect.get(target, name, receiver)
- Reflect.set(target, name, value, receiver)
- Reflect.defineProperty(target, name, desc)
- Reflect.deleteProperty(target, name)
- Reflect.has(target, name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)
來(lái)一個(gè)高端大氣上檔次我自己都理解不透徹的實(shí)例
完全抄襲自阮一峰老師,只是他寫(xiě)得很多菜鳥(niǎo)看不懂,我呢照顧菜鳥(niǎo)一波,糅合糅合
const queuedObservers = new Set()
const observe = fn => queuedObservers.add(fn)
const handler = {
set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver)
queuedObservers.forEach(observer => observer())
return result;
}
}
const observable = obj => new Proxy(obj, handler)
const personD = observable({
name: '張三',
age: 20
});
let print = () => {
console.log(`${personD.name}, ${personD.age}`)
}
observe(print);
personD.name = '李四';
// 輸出
// 李四, 20
- 觀察者模式(Observer mode)指的是函數(shù)自動(dòng)觀察數(shù)據(jù)對(duì)象,一旦對(duì)象有變化,函數(shù)就會(huì)自動(dòng)執(zhí)行。
- 實(shí)戰(zhàn)用處不要太多,所以我就抄過(guò)來(lái)了。用到的精英們別忘了膜拜一下先驅(qū)阮一峰老師。