ES6系列之Reflect

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

内容简介:确保对象的属性能正确赋值,广义上讲,即确保对象的原生行为能够正常进行,这就是注:和查找并返回
  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 ,返回一个布尔值,表示当前对象是否可扩展


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

查看所有标签

猜你喜欢:

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

Text Processing in Python

Text Processing in Python

David Mertz / Addison-Wesley Professional / 2003-6-12 / USD 54.99

Text Processing in Python describes techniques for manipulation of text using the Python programming language. At the broadest level, text processing is simply taking textual information and doing som......一起来看看 《Text Processing in Python》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具