我爱编程

ECMAScript之Reflect()

2018-06-21  本文已影响0人  锋叔

Reflect()和Proxy()一样都是ES6给操纵对象提供的新API,原来的对象很多方法都是命令式的,不符合函数式编程思想,什么是函数式编程思想,以后有空再来谈一下自己的理解。先看一个例子:

let person =  {
  name: 'zdf'
}
// 老写法(命令式)
'name' in person
// 打印
console.log('name' in person) // true

// 新写法(函数式)
Reflect.has(person , 'name')
// 打印
console.log(Reflect.has(person , 'name')) // true

Reflect的set()实例

// 空对象
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吧!是不是简单易上手。

Reflect的get()实例

// 对象
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

Reflect的has()实例

// 对象
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

Reflect的deleteProperty()实例

// 对象
let person =  {
  name: 'D',
  age: '18'
  job: 'RD'
}
// Reflect删除
Reflect.deleteProperty(person, 'name')
// 打印删除后的person
console.log(person) // => {age: 18, job: "RD"}

Reflect和Proxy的结合实例

let person =  {
  name: 'zdf'
}
// handler 
let handler = {
  set(target,name,value){
    let success = Reflect.set(target, name, value)
    if (success) {
      console.log('属性:' + name + ',值:' + value+ ',对象:' + target )
    }
    return success;
  }
}
// Proxy
let proxy = new Proxy(person,handler)
            
proxy.name = '疯子' // => 属性:name,值:疯子,对象:[object Object]
proxy.age = 18 // => 属性:age,值:18,对象:[object Object]
console.log(person) // => { name: '疯子', age: 18 }

静态方法汇总

可以一个一个自己去研究,我就不一一研究了。懒!

来一个高端大气上档次我自己都理解不透彻的实例

完全抄袭自阮一峰老师,只是他写得很多菜鸟看不懂,我呢照顾菜鸟一波,糅合糅合

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

上一篇 下一篇

猜你喜欢

热点阅读