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 }