ES6 新增 Reflect

139 阅读3分钟

1,描述

Reflect是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handler(en-US)的方法相同。Reflect不是一个函数对象,因此它是不可构造的。

Reflect 对象作为一个函数来调用。Reflect 的所有属性和方法都是静态的(就像 Math 对象)。

Reflect 对象提供了以下静态方法,这些方法与 proxy handler 方法的命名相同。

2,Reflect.defineProperty()

静态方法Reflect.defineProperty()基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。

// 语法, 如果target不是 Object,抛出一个 TypeError。
// target 目标对象。
// propertyKey 要定义或修改的属性的名称。
// attributes  要定义或修改的属性的描述。
Reflect.defineProperty(target, propertyKey, attributes)

// 例子
let obj = {}
Reflect.defineProperty(obj, 'x', {value: 7})  // true
obj.x                                         // 7

3,Reflect.deleteProperty()

静态方法Reflect.deleteProperty()允许用于删除属性。它很像f="developer.mozilla.org/zh-CN/docs/…](developer.mozilla.org/zh-CN/docs/…

// 语法,抛出一个 TypeError,如果target不是 Object。
// target       删除属性的目标对象。
// propertyKey  需要删除的属性的名称。
Reflect.deleteProperty(target, propertyKey)

// 例子
var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, "x"); // true
obj; // { y: 2 }

var arr = [1, 2, 3, 4, 5];
Reflect.deleteProperty(arr, "3"); // true
arr; // [1, 2, 3, , 5]

// 如果属性不存在,返回 true
Reflect.deleteProperty({}, "foo"); // true

// 如果属性不可配置,返回 false
Reflect.deleteProperty(Object.freeze({foo: 1}), "foo"); // false

4,Reflect.get()

Reflect.get() 方法与从 对象 (target[propertyKey]) 中读取属性类似,但它是通过一个函数执行来操作的。

// 语法,如果目标值类型不是 Object,则抛出一个 TypeError。
// target       需要取值的目标对象
// propertyKey  需要获取的值的键值
// receiver     如果target对象中指定了getter,receiver则为getter调用时的this值。
Reflect.get(target, propertyKey[, receiver])

// 例子
// Object
var obj = { x: 1, y: 2 };
Reflect.get(obj, "x"); // 1

// Array
Reflect.get(["zero", "one"], 1); // "one"

// Proxy with a get handler
var x = {p: 1};
var obj = new Proxy(x, {
  get(t, k, r) { return k + "bar"; }
});
Reflect.get(obj, "foo"); // "foobar"

5,Reflect.has()

静态方法Reflect.has()作用与 href="developer.mozilla.org/zh-CN/docs/…

// 语法,如果目标对象并非Object 类型,抛出TypeError。
// target       目标对象。
// propertyKey  属性名,需要检查目标对象是否存在此属性。
Reflect.has(target, propertyKey)


// 例子
Reflect.has({x: 0}, "x"); // true
Reflect.has({x: 0}, "y"); // false

// 如果该属性存在于原型链中,返回 true
Reflect.has({x: 0}, "toString");

// Proxy 对象的 .has() 句柄方法
obj = new Proxy({}, {
  has(t, k) { return k.startsWith("door"); }
});
Reflect.has(obj, "doorbell"); // true
Reflect.has(obj, "dormitory"); // false

6,Reflect.ownKeys()

静态方法Reflect.ownKeys()返回一个由目标对象自身的属性键组成的数组

// 语法,如果目标不是 Object,抛出一个 TypeError。
// target  获取自身属性键的目标对象。
// 返回值 由目标对象的自身属性键组成的 Array。
Reflect.ownKeys(target)

// 例子
Reflect.ownKeys({z: 3, y: 2, x: 1}); // [ "z", "y", "x" ]
Reflect.ownKeys([]); // ["length"]

var sym = Symbol.for("comet");
var sym2 = Symbol.for("meteor");
var obj = {[sym]: 0, "str": 0, "773": 0, "0": 0,
           [sym2]: 0, "-1": 0, "8": 0, "second str": 0};
Reflect.ownKeys(obj);
// [ "0", "8", "773", "str", "-1", "second str", Symbol(comet), Symbol(meteor) ]
// Indexes in numeric order,
// strings in insertion order,
// symbols in insertion order

7,Reflect.set()

静态方法Reflect.set()工作方式就像在一个对象上设置一个属性。

// 语法
// target      设置属性的目标对象。
// propertyKey 设置的属性的名称。 
// value       设置的值。
// receiver    如果遇到 setter,receiver则为setter调用时的this值。
Reflect.set(target, propertyKey, value[, receiver])


// 例子
// Object
var obj = {};
Reflect.set(obj, "prop", "value"); // true
obj.prop; // "value"

// Array
var arr = ["duck", "duck", "duck"];
Reflect.set(arr, 2, "goose"); // true
arr[2]; // "goose"

// It can truncate an array.
Reflect.set(arr, "length", 1); // true
arr; // ["duck"];

// With just one argument, propertyKey and value are "undefined".
var obj = {};
Reflect.set(obj); // true
Reflect.getOwnPropertyDescriptor(obj, "undefined");
// { value: undefined, writable: true, enumerable: true, configurable: true }