ES6系列之Reflect

栏目: JavaScript · 发布时间: 5年前

内容简介:确保对象的属性能正确赋值,广义上讲,即确保对象的原生行为能够正常进行,这就是注:和查找并返回
  1. Object 对象的属于语言内部的方法放到 Reflect 对象上,即从 Reflect 对象上拿 Object 对象内部方法
  2. 将用老 Object 方法报错的情况,改为返回 false
// 旧写法
try {
  Object.defineProperty(target, property, attributes);
  // success
} catch (e) {
  // failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}
  1. Object 操作变成函数行为
// 旧写法
'name' in Object //true
// 新写法
Reflect.has(Object,'name') //true
  1. ReflectProxy 是相辅相成的,在 Proxy 上有的方法,在 Reflect 就一定有
let target={}
let handler={
  set(target,proName,proValue,receiver){
    //确认对象的属性赋值成功
    let isSuccess=Reflect.set(target,proName,proValue,receiver)
    if(isSuccess){
      console.log("成功")
    }
    return isSuccess
  }
}
let proxy=new Proxy(target,handler)

确保对象的属性能正确赋值,广义上讲,即确保对象的原生行为能够正常进行,这就是 Reflect 的作用

二、Reflect的API

注:和 ProxyAPI 一致

2.1 Reflect.get(target,property,receiver)

查找并返回 target 对象的 property 属性

let obj={
  name:"poetries",
}
let result=Reflect.get(obj,"name")
console.log(result) //poetries
let obj={
  //属性yu部署了getter读取函数
  get yu(){
    //this返回的是Reflect.get的receiver参数对象
    return this.name+this.age
  }
}

let receiver={
  name:"shen",
  age:"18",
}

let result=Reflect.get(obj,"yu",receiver)
console.log(result) //shen18

注意:如果 Reflect.get() 的第一个参数不是对象,则会报错

2.2 Reflect.set(target,propName,propValue,receiver)

设置 target 对象的 propName 属性为 propValue

let obj={
  name:"poetries"
}

let result=Reflect.set(obj,"name","静观流叶")
console.log(result) //true
console.log(obj.name) //静观流叶

2.3 Reflect.set与Proxy.set

Reflect.setProxy.set 联合使用,并且传入 receiver ,则会进行定义属性操作

let obj={
  name:"chen"
}

let handler={
  set(target,key,value,receiver){
    console.log("Proxy拦截赋值操作")
    //Reflect完成赋值操作
    Reflect.set(target,key,value,receiver)
  },
  defineProperty(target,key,attribute){
    console.log("Proxy拦截定义属性操作")
    //Reflect完成定义属性操作
    Reflect.defineProperty(target,key,attribute)
  }
}

let proxy=new Proxy(obj,handler)
proxy.name="ya"
//Proxy拦截赋值操作
//Proxy拦截定义属性操作

为什么Reflect.set()传入receiver参数,就会触发定义属性的操作?

因为 Proxy.set() 中的 receiverProxy 的实例,即 obj ,而 Reflect.set 一旦传入 receiver ,就会将属性赋值到 receiver 上面,也是 obj ,所以就会触发 defineProperty 拦截

2.4 Reflect.has(obj,name)

var obj= {
  name: "poetries",
};
//旧写法
'name' in obj // true
//新写法
Reflect.has(obj, 'name') // true

2.5 Reflect.deleteProperty(obj, name)

删除对象的属性

// 旧写法
delete obj.name;
// 新写法
Reflect.deleteProperty(obj, 'name');

2.6 Reflect.construct(target, args)

function Person(name) {
  this.name = name;
}
// 旧 new写法
let person= new Person('poetries')
// 新写法:Reflect.construct 的写法
let person = Reflect.construct(Person, ['poetries']);

2.7 Reflect.getPrototypeOf(obj)

用于读取对象的 proto 属性,对应 Object.getPrototypeOf(obj)

2.8 Reflect.setPrototypeOf(obj, newProto)

设置目标对象的原型( prototype ),对应 Object.setPrototypeOf(obj, newProto) 方法

2.9 Reflect.apply(func, thisArg, args)

继承目标对象的特定方法

let array=[1,2,3,4,5,6]
// 旧写法
let small= Math.min.apply(Math, array) //1
let big = Math.max.apply(Math, array) //6
let type = Object.prototype.toString.call(small) //"[object Number]"
// 新写法
const small= Reflect.apply(Math.min, Math, array)
const big = Reflect.apply(Math.max, Math, array)
//第三个参数是Object类型的就好,因为调用的是Object的原型方法toString
const type = Reflect.apply(Object.prototype.toString, small, [])

2.10 Reflect.defineProperty(target, propertyKey, attributes)

function MyDate() {
  ...
  ...
}
// 旧写法
Object.defineProperty(MyDate, 'now', {
  value: () => Date.now()
});
// 新写法
Reflect.defineProperty(MyDate, 'now', {
  value: () => Date.now()
});

Proxy.defineProperty 配合使用

let proxy = new Proxy({}, {
  defineProperty(target, prop, descriptor) {
    console.log(descriptor);
    return Reflect.defineProperty(target, prop, descriptor);
  }
});

proxy .name= 'chen';
// {value: "chen", writable: true, enumerable: true, configurable: true}
p.name // "chen"

如上, Proxy.defineProperty 对属性赋值设置拦截,然后使用 Reflect.defineProperty 完成赋值

2.11 Reflect.getOwnPropertyDescriptor(target, propertyKey)

基本等同于 Object.getOwnPropertyDescriptor ,用于得到指定属性的描述对象

2.12 Reflect.isExtensible (target)

对应 Object.isExtensible ,返回一个布尔值,表示当前对象是否可扩展


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Computer Science Using Python

Introduction to Computer Science Using Python

Dierbach, Charles / 2012-12 / $ 133.62

Introduction to Computer Science Using Python: A Computational Problem-Solving Focus introduces students to programming and computational problem-solving via a back-to-basics, step-by-step, objects-la......一起来看看 《Introduction to Computer Science Using Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器