javascript 之反射

Reflect对象的方法清单如下:

  1. Reflect.apply(target, thisArg, args)

  2. Reflect.construct(target, args)

  3. Reflect.get(target, name, receiver)

  4. Reflect.set(target, name, value, receiver)

  5. Reflect.defineProperty(target, name, desc)

  6. Reflect.deleteProperty(target, name)

  7. Reflect.has(target, name)

  8. Reflect.ownKeys(target)

  9. Reflect.isExtensible(target)

  10. Reflect.preventExtensions(target)

  11. Reflect.getOwnPropertyDescriptor(target, name)

  12. Reflect.getPrototypeOf(target)

  13. Reflect.setPrototypeOf(target, prototype)

上面这些方法的作用, 大部分与Object对象的同名方法的作用都是相同的, 而且它与Proxy对象的方法是一一对应的。 下面是对其中几个方法的解释。

 

( 1) Reflect.get(target, name, receiver)
查找并返回target对象的name属性, 如果没有该属性, 则返回undefined。
如果name属性部署了读取函数, 则读取函数的 this 绑定receiver。

 

 
  1. var obj = {

  2. get foo() {

  3. return this.bar();

  4. },

  5. bar: function() {

  6. ...

  7. }

  8. };

  9. // 下面语句会让 this.bar()

  10. // 变成调用 wrapper.bar()

  11. Reflect.get(obj, "foo", wrapper);

(2) Reflect.set(target, name, value, receiver)
设置target对象的name属性等于value。 如果name属性设置了赋值函数, 则赋值函数的this绑定receiver。
( 3) Reflect.has(obj, name)
等同于name in obj。
( 4) Reflect.deleteProperty(obj, name)
等同于delete obj[name]。
( 5) Reflect.construct(target, args)
等同于new target(...args), 这提供了一种不使用new, 来调用构造函数的方法。
( 6) Reflect.getPrototypeOf(obj)
读取对象的__proto__属性, 对应Object.getPrototypeOf(obj)。
( 7) Reflect.setPrototypeOf(obj, newProto)
设置对象的__proto__属性, 对应Object.setPrototypeOf(obj, newProto)。
( 8) Reflect.apply(fun, thisArg, args)
等同于Function.prototype.apply.call(fun, thisArg, args)。 一般来说, 如果要绑定一个函数的 this 对象, 可以这样写fn.apply(obj, args), 但是如果函数定义了自己的apply方法, 就只能写成Function.prototype.apply.call(fn, obj, args), 采用 Reflect 对象可以简化这种操作。
另外, 需要注意的是, Reflect.set()、 Reflect.defineProperty()、 Reflect.freeze()、 Reflect.seal() 和Reflect.preventExtensions() 返回一个布尔值, 表示操作是否成功。 它们对应的 Object 方法, 失败时都会抛出错误。

 

 

 
  1. // 失败时抛出错误

  2. Object.defineProperty(obj, name, desc);

  3. // 失败时返回 false

  4. Reflect.defineProperty(obj, name, desc);

上面代码中, Reflect.defineProperty方法的作用与Object.defineProperty是一样的, 都是为对象定义一个属性。 但是, Reflect.defineProperty方法失败时, 不会抛出错误, 只会返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值