整理学习——ES6的Reflect

文章目录

  • 简单说明
  • Reflect对象的方法
    • Reflect.apply(target, thisArgument, argumentsList)
      • 异常
    • Reflect.construct(target, argumentsList[, newTarget])
      • 异常
    • Reflect.defineProperty(target, propertyKey, attributes)
      • 异常
    • Reflect.deleteProperty(target, propertyKey)
      • 异常
    • Reflect.get(target, propertyKey[, receiver])
      • 异常
    • Reflect.getOwnPropertyDescriptor(obj, prop)
      • 异常
    • Reflect.getPrototypeOf(target)
      • 异常
    • Reflect.has(target, propertyKey)
      • 异常
    • Reflect.isExtensible(target)
      • 异常
    • Reflect.ownKeys(target)
      • 异常
    • Refledct.preventExtensions()
      • 异常
    • Reflect.set(target, propertyKey, value[, receiver])
      • 异常
    • Reflect.setPrototypeOf(target, prototype)
      • 异常
  • 与Object的方法的区别整合

简单说明

Reflect也是ES6为了操作对象而提供的新API。Reflect是一个内置的对象,它提供拦截JavaScript操作的方法,这些方法与处理器对象的方法相同。它不是一个函数对象,所以不可构造。同时Reflect的所有属性和方法都是静态。
Reflect对象的设计目的有这几个:

  1. 将Object对象的一些明显属于语言内部的方法,放到Reflect对象上。

    目前,某些方法同时在Object和Reflect对象上部署,未来的新方法将值部署在Reflect对象上

  2. 修改某些Object方法的返回结果,让其变得更合理。(比如,Object.defineProperty(obj, name, desc)在无法定义属性时会抛出错误,而Reflect.defineProperty(obj, name, desc)返回false)
  3. 让Object操作都变成函数行为。
    比如name in objdelete obj[name],Reflect中使用Reflect.has(obj, name)Reflect.deleteProperty(obj, name)
  4. Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。可以使Proxy对象更方便地调用对应的Reflect方法,完成默认行为。

Object与Reflect的差别:

Object Reflect
遭遇错误的结果 报错 返回false
操作 命令式语句 函数行为

Reflect对象的方法

Reflect对象的方法都是静态方法。与Proxy对象中的handler对象的函数类似但要有所区别。

Reflect.apply(target, thisArgument, argumentsList)

对义工函数进行调用操作,同时可以传入一个数组作为调用参数。和Function.prototype.apply()功能相似。
target:目标函数
thisArgument:target函数调用时绑定的this对象
argumentsList:target函数调用时传入的实参列表,该参数应该是一个类数组的对象。

异常

如果target对象不可调用,会抛出TypeError。

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

对构造函数进行new操作,相当于执行new target(...args)。返回以target函数为构造函数,argumentsList为初始化参数的对象实例。
target:被运行的目标构造函数
argumentsList:类数组,目标构造函数调用时的参数。
newTarget:可选,新创建对象的原型对象,参考new.target操作符,默认值为target

异常

如果target或者new Target不是构造函数,那么会抛出TypeError。

Reflect.defineProperty(target, propertyKey, attributes)

基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。表示属性是否被成功定义。
target:目标对象
propertyKey:要定义或修改的属性的名称。
attributes:要定义或修改的属性的描述。

异常

如果target不是Object,会抛出TypeError。

Reflect.deleteProperty(target, propertyKey)

作为函数的delete操作符,相当于执行delete target[name]。返回一个Boolean表示是否被成功删除。
target:目标对象
propertyKey:需要删除的属性的名称。

异常

如果target不是Object的话,抛出TypeError。

Reflect.get(target, propertyKey[, receiver])

获取目标对象身上某个属性的值,类似于target[name].。返回属性的值,若没有则返回undefined。
target:目标对象
propertyKey:需要获取的值的键名
receiver:若target对象中指定了getter,receiver则为getter调用时的this值

异常

如果目标值非Object,则抛出TypeError

Reflect.getOwnPropertyDescriptor(obj, prop)

与Object.getOwnPropertyDescriptor()方法相似,返回给定对象的自身属性的属性描述符,非原型链中的属性。返回对应的描述符对象,否则返回undefined。
obj:目标对象
prop:要获取描述符的属性的名称或者对应的Symbol类型。

异常

如果target不是Object类型,会抛出一个TypeError

Reflect.getPrototypeOf(target)

返回指定对象的原型(内部的[[Prototype]])。与Object.getPrototypeOf()一样。返回给定对象的原型,如果没有继承的属性则返回null
target:目标对象

异常

如果target不是Object类型,则抛出TypeError

Reflect.has(target, propertyKey)

判断对象中是否存在对应的键。返回一个Boolean表示是否存在这个属性
target:目标对象
propertyKey:键名

异常

如果target不是Object类型,则抛出TypeError

Reflect.isExtensible(target)

判断一个对象是否可扩展,与Object.isExtensible()类似,但是,当第一个参数不是对象时,该函数会抛出TypeError,而Object.isExtensible()则会将第一个参数强制转换为一个对象。
该函数返回一个Boolean值表示目标对象是否可扩展。

Reflect.isExtensible(1);
//result: Uncaught TypeError: Reflect.isExtensible called on non-object
Object.isExtensible(1);
//result: false

target:目标对象

异常

如果target不是Object类型,则抛出TypeError

Reflect.ownKeys(target)

返回一个包含自身所有属性键,不包含继承属性,的数组。类似于Object.keys(),但是不受enumerable影响。
target:目标对象
其返回值相当于

Object.getOwnPropertyNames(target)
	.concat(
		Object.getOwnPropertySymbols(target)
	)

异常

如果target不是Object类型,则抛出TypeError

Refledct.preventExtensions()

阻止新属性添加到对象。与Object.preventExtensions()相似。当第一个参数不是对象时,该函数会抛出一个TypeError,而Object.preventExtensions()会将其强制转换成对象。

Reflect.preventExtensions(1);
//result: Uncaught TypeError: Reflect.preventExtensions called on non-object
Object.preventExtensions(1);
//result: false

异常

如果target不是Object类型,则抛出TypeError

Reflect.set(target, propertyKey, value[, receiver])

将值分配给属性的函数。返回一个Boolean,表示更新成功与否。
target:目标对象
propertyKey:需要设置的属性名称
value:设置的值
receiver:可选,setter函数中的this值

异常

如果target不是Object类型,则抛出TypeError

Reflect.setPrototypeOf(target, prototype)

设置原型为一个新的原型对象或者是让其为null,与Object.setPrototypeOf()相似,区别在于返回值的不同。返回一个Boolean表示设置是否成功。
target:目标对象
prototype:设置值,对象或者是为null

异常

如果target不是一个对象,或者设置的值不是一个对象也不是null,则会抛出TypeError。

与Object的方法的区别整合

函数 区别点 Object Reflect
isExtensible()
preventExtensions()
第一个参数不是一个对象 强制转为对象 抛出TypeError
获取属性键 是否受enumerable Object.keys()
受影响
Reflect.ownKeys()
不受影响
defineProperty() 返回值 成功:返回一个对象
失败,即属性没有被成功定义:抛出TypeError
返回一个Boolean表示成功与否

参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
http://caibaojian.com/es6/proxy.html

你可能感兴趣的:(JavaScript)