ECMAScript之Reflect()

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ū)阮一峰老師。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • defineProperty() 學(xué)習(xí)書(shū)籍《ECMAScript 6 入門(mén) 》 Proxy Proxy 用于修改某...
    Bui_vlee閱讀 704評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,535評(píng)論 19 139
  • 本文為阮一峰大神的《ECMAScript 6 入門(mén)》的個(gè)人版提純! babel babel負(fù)責(zé)將JS高級(jí)語(yǔ)法轉(zhuǎn)義,...
    Devildi已被占用閱讀 2,128評(píng)論 0 4
  • 有沒(méi)有 文/阿馨 有沒(méi)有一種相遇 是前世等候 有沒(méi)有一種相守 是不離左右 有沒(méi)有一種記憶 是總在心頭 有沒(méi)有一種相...
    詩(shī)意的棲居_b130閱讀 148評(píng)論 0 2
  • 伙伴們!我為你們驕傲! 文/韓起云 我想從心底里喊一聲:墨海尋香讀書(shū)會(huì)的伙伴們,我為你們驕傲! 不忘初心,砥礪前行...
    韓起云閱讀 333評(píng)論 0 2

友情鏈接更多精彩內(nèi)容