经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
Reflection 基础知识(一)
来源:cnblogs  作者:只做你的向日葵  时间:2021/12/31 17:19:35  对本文有异议

反射机制的定义

反射通常指在程序在运行时能够获取自身的信息。

静态语言反射

在java中使用反射的一个例子

  1. Class<?> clazz = Class.forName("com.netease.main.Person"):
  2. Method[] methods = clazz.getMethods():

JavaScript 反射

假设有一个对象obj,我们不知道他的内部结构和Api。这个时候我们通过某种机制获取一个对象的内部结构,这种机制就叫做反射。

我们可以看下javaScript中的几个例子

  1. for(let p in window) {
  2. console.log(p)
  3. }
  4. // 了解了window内部结构后,我们可以使用window内部的属性,我们尝试调用它的方法
  5. window['open']('http://www.baidu.com')
  1. // 使用Object.keys方法获取对象的内部结构:
  2. let obj = {
  3. id: 1,
  4. name: 'xxx',
  5. test: function test() {
  6. console.log('test')
  7. }
  8. }
  9. // 输出结果:
  10. console.log(Object.keys(obj))

以上我们通过几个例子基本了解了什么是反射。

Reflect

Reflect是一个内置对象,它提供拦截JavaScript操作的方法。Reflect没有构造函数,不能使用‘new’运算符去新建,也不能将其作为一个函数去调用。Reflect的所有属性和方法都是静态的(类似Math对象)。

为什么需要Reflect对象?

  • 把实现反射机制的方法重新归结在一起并且简化操作,保持JS语意清晰和语法简单。
  1. let key1 = 'id', key2 = Symbol.for('name'),
  2. obj = { [key1]: 1, [key2]: 'xxx' };
  3. let keys = Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj))
  4. // 使用Reflect 获取所有keys
  5. let reflectKeys = Reflect.ownKeys(obj)
  • 补充了一些Object对象没有的方法,比如Reflect.apply。
  1. function fn(...rest) {
  2. console.log(rest);
  3. console.log('test:' + this.name)
  4. }
  5. fn.apply = null;
  6. fn.apply(1,2,3); // TypeError: fn.apply is not a function
  7. Function.prototype.apply.call(fn, {name: 'xxx'}) // [] test: name
  8. Reflect.apply(fn, {name: 'xxx'},[1,2,3]);
  •  让Object操作都变成函数行为,比如使用Reflect.has(obj,name)替换name in obj。
  1. let obj1 = { name: 'xxx'};
  2. if ('name' in obj1) {
  3. console.log('test ok')
  4. }
  5. let obj2 = { name: 'xxx'};
  6. if(Reflect.has(obj2, 'id')) {
  7. console.log('test ok')
  8. }

Reflect.apply()

对于一个函数进行调用操作,同时可以传入一个数组作为调用参数。

  1. Reflect.apply(target,thisArgument,argumentsList)

Reflect.construct()

对构造函数进行new 操作,相当于执行new target(...args)。

  1. Reflect.construct(target,argumentsList[,newTarget])

Reflect.defineProperty()

定义对象的一个属性。attributes为属性描述

  1. Reflect.defineProperty(target,property,attributes)

 Reflect.deleteProperty()

删除对象的一个属性。

  1. Reflect.deleteProperty(target,property)

Reflect.get()

查找并返回对象的属性值。

  1. Reflect.get(target, property[, receiver])

可以看个例子

  1. // 缺省receiver
  2. let obj = {
  3. a: 1,
  4. b: 2,
  5. get c() {
  6. return this.a + this.b
  7. }
  8. }
  9. console.log(Reflect.get(obj, 'a')) // 1
  10. console.log(Reflect.get(obj, 'b')) // 2
  11. console.log(Reflect.get(obj, 'c')) // 3
  12. // 加上receiver
  13. let obj1 = {
  14. a: 1,
  15. b: 2,
  16. get c() {
  17. return this.a + this.b
  18. }
  19. }
  20. let receiver = {
  21. a: 4,
  22. b: 4,
  23. }
  24. console.log(Reflect.get(obj1, 'a',receiver)) // 1
  25. console.log(Reflect.get(obj1, 'b',receiver)) // 2
  26. console.log(Reflect.get(obj1, 'c',receiver)) // 8

 Reflect.set()

 设置对象的属性值

  1. Reflect.set(target, property, value[, receiver])
  1. // 缺省receiver
  2. let obj = {
  3. name: 'test',
  4. }
  5. console.log(obj.name); // test
  6. Reflect.set(obj, 'name', 'xxx')
  7. console.log(obj.name) // xxx
  1. // 加上reveiver
  2. let obj = {
  3. name: 'test',
  4. set nickname(value) {
  5. return this.name = value
  6. }
  7. }
  8. let receiver = {
  9. name: 'test'
  10. }
  11. console.log(obj.name); // test
  12. console.log(receiver.name); // test
  13. Reflect.set(obj, 'nickname', 'xxx', receiver);
  14. console.log(obj.name); // test
  15. console.log(receiver.name); // xxx

 Reflect.getOwnPropertyDescriptor()

 查找并返回对象的属性描述符。

  1. Reflect.getOwnPropertyDescriptor(target, propertyKey)

 

 Reflect.getPrototypeOf()

返回指定对象的原型,读取对象的__proto__属性。

  1. Reflect.getPrototypeOf(target)

 

 

 Reflect.setPrototypeOf()

设置指定对象的原型。

  1. Reflect.setPrototypeOf(target,prototype)

 

 Reflect.has()

判断obj是否有某个属性。

  1. Reflect.has(target,prototype)

 Reflect.isExtensible()

判断一个对象是否可扩展

  1. Reflect.isExtensible(target)

 Reflect.preventExtensions()

 让对象变为不可扩展。

  1. Reflect.preventExtensions(target)

 

 

Reflect.ownKeys()

 返回要给包含所有自身属性(不包含继承属性)的数组。

  1. Reflect.ownKeys(target)

原文链接:http://www.cnblogs.com/likme/p/15753659.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号