文章目录
一、Reflect
Reflect相关的静态方法:
- 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)
1. 将Object属于语言内部的方法放到Reflect
// Object -> Reflect
// 为什么这么干,为Object减负,将Object下面的一些方法,转移到Reflect下面
let obj = {}
let newVal = ''
Reflect.defineProperty(obj, 'name', {
get() {
return newVal
},
set(val) {
console.log('set') // set
newVal = val
}
})
obj.name = 'es'
console.log(obj.name) // es
2. 修改某些Object方法的返回结果,让其变得更合理
// 比如Object.defineProperty()方式,如果不可定义,则会抛出异常
// 那对应的处理方式,只能try-catch
try {
Object.defineProperty()
} catch (e) {
}
// Reflect.defineProperty()返回的是布尔值
if (Reflect.defineProperty()) {
} else {
}
3. 让Object操作变成函数行为
// Object的很多操作都是命令式的
console.log('assign' in Object) // true
// Reflect方式
console.log(Reflect.has(Object, 'assign')) // true
4. Reflect对象的方法与Proxy对象的方法一一对应
let user = {
username: 'zhangsan',
age: 34,
_pwd: '****'
}
user = new Proxy(user, {
get(target, prop) {
if (prop.startsWith('_')) {
throw new Error('不可访问')
} else {
// return target[prop]
// target: 对象 prop:哪个属性
return Reflect.get(target, prop)
}
},
set(target, prop, val) {
if (prop.startsWith('_')) {
throw new Error('不可访问')
} else {
// target[prop] = val
Reflect.set(target, prop, val)
return true
}
},
deleteProperty(target, prop) { // 拦截删除操作
if (prop.startsWith('_')) {
throw new Error('不可删除')
} else {
// delete target[prop]
Reflect.deleteProperty(target, props)
return true
}
},
ownKeys(target) {
// return Object.keys(target).filter( key => !key.startsWith('_'))
return Reflect.ownKeys(target).filter( key => !key.startsWith('_'))
}
})
console.log(user.age) // 34
// console.log(user._pwd) // Uncaught Error: 不可访问
// user._pwd = '123' // Uncaught Error: 不可访问
// delete user._pwd // 不可删除
for (let key in user) {
console.log(key)
}
// apply
let sum = (...args) => {
let num = 0
args.forEach(item => {
num += item
})
return num
}
sum = new Proxy(sum, {
apply(target, ctx, args) {
// return target(...args) * 2
return Reflect.apply(target, target, [...args]) * 2
}
})
console.log(sum(1, 2))
console.log(sum.call(null, 1, 2, 3))
console.log(sum.apply( null, [1, 2, 3]))