学习笔记 JavaScript ES6 Reflect

学习内容:

  • 将Object属于语言内部的方法放到Reflect上
  • 修改某些Object方法的返回结果,让其变得更合理
  • 让Object操作变成函数行为
  • Reflect对象的方法与Proxy对象的方法相辅相成

将Object属于语言内部的方法放到Reflect上

ES之前的设计,有很多属性方法都是在window或Object上面,这样并不规范,所以ES才要升级。

比如下面的代码中,把Object直接改为Reflct就可以直接运行了,这个就是把Object下的defineProperty()方法转移到了Reflect下面:

let obj = {}
let newValue = ''
// Object.defineProperty(obj, 'name', {
Reflect.defineProperty(obj, 'name', {
    get() {
        return newValue
    },
    set(val) {
        console.log('set')
        newValue = val
    }
}) 
obj.name = 'test'
console.log(obj.name)

修改某些Object方法的返回结果,让其变得更合理

// 之前判断能否定义成功需要用try catch
try {
    Object.defineProperty
} catch (e) {

}

// ES6,判断是否定义成功直接直接返回boolean了。
//Reflect.defineProperty()这个方法返回boolean
if(Reflect.defineProperty()){

} else {

}

让Object操作变成函数行为

console.log('assign' in Object) // 命令式操作
console.log(Reflect.has(Object, 'assign')) // 函数式操作

---------
true
true

Reflect对象的方法与Proxy对象的方法相辅相成

看个例子:

let user = {
    name : 'Sure',
    age : 36,
    _password : '***'
}
user = new Proxy(user, {
    get(target, prop) {
        if(prop.startsWith('_')) {
            throw new Error('Error')
        } else {

            // 注意,把下面改写为Reflect
            // return target[prop]
            // 与Proxy一一对应
            return Reflect.get(target, prop) // 拦截get操作,所以是Reflect.get
        }
    }
})

console.log(user.name)

---------
Sure

再来个例子:

let sum = (...args) => {
    let num = 0
    args.forEach(item => {
        num += item
    })
    return num
}

sum = new Proxy(sum, {
    apply(target, ctx, args) {

        // 改为Reflect.apply方法
        // return target(...args) * 2
        return Reflect.apply(target, target, [...args]) * 2
    }
})

console.log(sum(1,2))

其它的写法都类似啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值