当前位置 > it书童 > 大前端 > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

Reflect 反射的操作场景

大前端 it书童 2020-10-06 08:20:50 0赞 0踩 311阅读 0评论

获取属性描述符

const obj = { x:1, y: 2 }
console.log(Reflect.getOwnPropertyDescriptor(obj, 'x'))
// {value: 1, writable: true, enumerable: true, configurable: true}

console.log(Object.getOwnPropertyDescriptor(obj, 'y'))
// {value: 2, writable: true, enumerable: true, configurable: true}

获取原型对象

let d = new Date()
console.log(Reflect.getPrototypeOf(d))

判断是否有某个属性

let obj = { x: 1, y: 2}
console.log(Reflect.has(obj, 'x')) 

要习惯使用 Reflect,比 Object 更强大,更加语义化

判断一个对象是否可扩展

let obj = { x: 1, y: 2}
obj.z = 3
console.log(Reflect.isExtensible(obj)) // true

将对象冻结后,就不可扩展了

let obj = { x: 1, y: 2}
// 冻结对象
Object.freeze(obj)
obj.z = 3 // 不起作用
console.log(Reflect.isExtensible(obj)) // false
console.log(obj) // {x: 1, y: 2}

判断自身的属性,排除原型链上的属性

let obj = { x: 1, y: 2}
console.log(Reflect.ownKeys(obj)) // ["x", "y"]
console.log(Reflect.ownKeys([1, 2])) // ["0", "1", "length"]

冻结对象,禁止扩展的另一种方式

let obj = { x: 1, y: 2}
console.log(Reflect.preventExtensions(obj))

Reflect.preventExtensions(obj)
console.log(Reflect.isExtensible(obj))

操作属性

let obj = { x: 1, y: 2}
Reflect.set(obj, 'z', 4)
console.log(obj) // {x: 1, y: 2, z: 4}

操作数组

const arr = ['duck', 'duck', 'duck']
Reflect.set(arr, 2, 'bird') // 根据索引修改
console.log(arr) // ["duck", "duck", "bird"]

修改原型对象

const arr = ['duck', 'duck', 'duck']
console.log(Reflect.getPrototypeOf(arr))
// 将 arr 的原型对象修改为 String 的原型对象
Reflect.setPrototypeOf(arr, String.prototype)

console.log(Reflect.getPrototypeOf(arr))
// arr 的 sort 无法使用了,因为现在已经是 String 的原型对象
arr.sort()

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/762/operation-scenarios-of-reflect-reflection