js之Reflect

485 阅读5分钟

Reflect

  • Reflect 是一个内置的对象,它提供了一套统一操作Object的API。
  • Reflect 不是一个函数对象,因此它是不可构造的,不能通过 new 运算符对其进行调用,或者将Reflect对象作为一个函数来调用。
  • Reflect 的所有属性和方法都是静态的(就像Math对象)。

静态方法

  • Reflect.apply(target, thisArg, args)

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

var obj1 = {};
Reflect.apply(Math.floor, obj1, [1.88]) // 1;
  • Reflect.construct(target, args)

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

const obj2 = Reflect.construct(Date, [2021, 3, 1]);
  • Reflect.get(target, name, receiver)

获取对象身上某个属性的值,类似于 target[name]。如果没有该属性,则返回undefined。

var obj3 = { x: 1, y: 2 }; 
Reflect.get(obj3, "x"); // 1
  • Reflect.set(target, name, value, receiver) 将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
var obj4 = {}; 
Reflect.set(obj4, "prop", "value"); // true
  • Reflect.defineProperty(target, name, desc)

Reflect.defineProperty方法基本等同于Object.defineProperty,直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,不同的是,Object.defineProperty返回此对象。而Reflect.defineProperty会返回布尔值.

const obj5 = {}; 
Reflect.defineProperty(obj5, 'property', { 
    value: 666, 
    writable: false 
}); // true
  • Reflect.deleteProperty(target, name)

作为函数的delete操作符,相当于执行 delete target[name]。

var obj6 = { x: 1, y: 2 }; 
Reflect.deleteProperty(obj6, "x"); // true 
obj; // { y: 2 }
  • Reflect.has(target, name)

判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。

const obj7 = {x: 0};
Reflect.has(obj7, "x"); // true
  • Reflect.ownKeys(target)

返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响, Object.keys返回所有可枚举属性的字符串数组).

const obj8 = {z: 3, y: 2, x: 1};
Reflect.ownKeys(obj8); // [ "z", "y", "x" ]
  • Reflect.isExtensible(target)

判断一个对象是否是可扩展的(是否可以在它上面添加新的属性),类似于 Object.isExtensible()。返回表示给定对象是否可扩展的一个Boolean 。(Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展。)

var obj9 = {}; 
Reflect.isExtensible(obj9); // true
  • Reflect.preventExtensions(target)

让一个对象变的不可扩展,也就是永远不能再添加新的属性。

var obj10 = {}; 
Reflect.isExtensible(obj10); // true 
Reflect.preventExtensions(obj10); 
Reflect.isExtensible(obj10); // false
  • Reflect.getOwnPropertyDescriptor(target, name)

如果对象中存在该属性,如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。类似于 Object.getOwnPropertyDescriptor()。

const obj11 = {x: "hello"};
Reflect.getOwnPropertyDescriptor(obj11, "x");
// {value: "hello", writable: true, enumerable: true, configurable: true}

Reflect.getPrototypeOf(target)

返回指定对象的原型.类似于 Object.getOwnPropertyDescriptor()。

var obj12 = {};
Reflect.getPrototypeOf(obj12); // 等同于Object.prototype
  • Reflect.setPrototypeOf(target, prototype)

设置对象原型的函数. 返回一个 Boolean, 如果更新成功,则返回true。如果 target 不是 Object ,或 prototype 既不是对象也不是 null,抛出一个 TypeError 异常。

var obj13 = {}; 
Reflect.setPrototypeOf(obj13, null); // true

Object 和 Reflect API 上可用方法之间的差异

如果 API 中不存在某种方法,则将其标记为 N/A。

Method NameObjectReflect
defineProperty()Object.defineProperty() 返回传递给函数的对象。如果未在对象上成功定义属性,则返回TypeError如果在对象上定义了属性,则Reflect.defineProperty()返回true,否则返回false
defineProperties()Object.defineProperties() 返回传递给函数的对象。如果未在对象上成功定义属性,则返回TypeErrorN/A
set()N/A如果在对象上成功设置了属性,则Reflect.set()返回true,否则返回false。如果目标不是Object,则抛出TypeError
get()N/AReflect.get()返回属性的值。如果目标不是Object,则抛出TypeError
deleteProperty()N/A如果属性从对象中删除,则Reflect.deleteProperty()返回true,否则返回false
getOwnPropertyDescriptor()如果传入的对象参数上存在Object.getOwnPropertyDescriptor() ,则会返回给定属性的属性描述符,如果不存在,则返回undefined如果给定属性存在于对象上,则Reflect.getOwnPropertyDescriptor() 返回给定属性的属性描述符。如果不存在则返回undefined,如果传入除对象(原始值)以外的任何东西作为第一个参数,则返回TypeError
getOwnPropertyDescriptors()Object.getOwnPropertyDescriptors() 返回一个对象,其中包含每个传入对象的属性描述符。如果传入的对象没有拥有的属性描述符,则返回一个空对象。N/A
getPrototypeOf()Object.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null。在 ES5 中为非对象抛出TypeError,但在 ES2015 中强制为非对象。Reflect.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回 null,并为非对象抛出TypeError
setPrototypeOf()如果对象的原型设置成功,则Object.setPrototypeOf()返回对象本身。如果设置的原型不是Objectnull,或者被修改的对象的原型不可扩展,则抛出TypeError如果在对象上成功设置了原型,则Reflect.setPrototypeOf() 返回 true,否则返回 false(包括原型是否不可扩展)。如果传入的目标不是Object,或者设置的原型不是Objectnull,则抛出TypeError
isExtensible()如果对象是可扩展的,则 Object.isExtensible()返回 true,否则返回 false。如果第一个参数不是对象(原始值),则在 ES5 中抛出TypeError。在 ES2015 中,它将被强制为不可扩展的普通对象并返回false如果对象是可扩展的,则Reflect.isExtensible() 返回true,否则返回false。如果第一个参数不是对象(原始值),则抛出TypeError
preventExtensions()Object.preventExtensions() 返回被设为不可扩展的对象。如果参数不是对象(原始值),则在 ES5 中抛出TypeError。在 ES2015 中,参数如为不可扩展的普通对象,然后返回对象本身。returns true if the object has been made non-extensible, and false if it has not. Throws a TypeError if the argument is not an object (a primitive).如果对象已变得不可扩展,则Reflect.preventExtensions() 返回true,否则返回false。如果参数不是对象(原始值),则抛出TypeError
keys()Object.keys()返回一个字符串数组,该字符串映射到目标对象自己的(可枚举)属性键。如果目标不是对象,则在 ES5 中抛出TypeError,但将非对象目标强制为 ES2015 中的对象N/A
ownKeys()N/AReflect.ownKeys()返回一个属性名称数组,该属性名称映射到目标对象自己的属性键。如果目标不是Object,则抛出TypeError