Java代码中,在编译阶段就会知道用到哪个类了,但是如果不想让编译器在编译阶段用哪个类的话,那么就需要使用反射机制,让它在编译阶段不知道,在运行阶段才知道。
例如,在用apply方法的时候,我们一般会先声明用那个函数身上的apply,但是如果用了反射,则可以先用apply,再去指定用的哪个函数身上的apply。即,运行的时候再去找用apply的哪个函数。
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法,这些方法与处理器对象的方法相同。Reflect不是一个函数对象,因此它是不可构 的。
一. apply
//es5
console.log(Math.floor.apply(null, [3.72]))
//es6反射
console.log(Reflect.apply(Math.floor, null, [4.72]))
反射的好处:
let price = 91.5
if (price > 100) {
price = Math.floor.apply(null, [price])
} else {
price = Math.ceil.apply(null, [price])
}
// es6 Reflect用法
console.log(Reflect.apply(price > 100 ? Math.floor : Math.ceil, null, [price]))
二. contruct 相当于new
let d = new Date()
console.log(d.getTime())
let d = Reflect.construct(Date, [])
console.log(d.getTime(), d instanceof Date
三.
const student = {}
const r = Reflect.defineProperty(student, 'name', { value: 'Mike2' })
console.log(student, r)
const obj = { x: 1, y: 2 }
Reflect.deleteProperty(obj, 'x')
console.log(obj)
console.log(Reflect.get(obj, 'x'))
console.log(Reflect.get([3, 4], 1))
console.log(Object.getOwnPropertyDescriptor(obj, 'y'))
四.
let d = new Date()
console.log(Reflect.getPrototypeOf(d))
const obj = { x: 1, y: 2 }
console.log(Reflect.has(obj, 'y'))
obj.z = 3
Object.freeze(obj)
obj.z = 3
console.log(Reflect.isExtensible(obj))
console.log(obj)
console.log(Reflect.ownKeys(obj))
console.log(Reflect.ownKeys([1, 2]))
// Symbol
Reflect.preventExtensions(obj)
console.log(Reflect.isExtensible(obj))
Reflect.set(obj, 'z', 4)
console.log(obj)
const arr = ['duck', 'duck', 'duck']
Reflect.set(arr, 2, 'goose')
console.log(arr)
console.log(Reflect.getPrototypeOf(arr))
Reflect.setPrototypeOf(arr, String.prototype)
// arr.sort()
console.log(Reflect.getPrototypeOf(arr))