相关链接
代码地址
- 静态方法:gitee.com/carrierxia/…
- handler对象方法:gitee.com/carrierxia/…
Reflect 静态方法
-
属性访问相关:
Reflect.get(target, propertyKey[, receiver])
:获取对象target
上属性propertyKey
的值,类似target[propertyKey]
。如果提供receiver
,且target
的属性是一个 getter 函数 ,则receiver
会作为函数运行时的this
值。
let obj = { x: 1, y: 2 };
console.log(Reflect.get(obj, 'x')); // 输出 1
Reflect.set(target, propertyKey, value[, receiver])
:设置对象target
上属性propertyKey
的值为value
,类似target[propertyKey] = value
。如果设置成功返回true
,失败返回false
。当target
和receiver
不同时,会使用target
的属性描述符(查找 setter 或判断属性是否可写),但在receiver
上设置属性 。
let obj = {};
console.log(Reflect.set(obj, 'name', 'Alice')); // 输出 true
Reflect.has(target, propertyKey)
:判断对象target
是否存在属性propertyKey
,和in
运算符功能相同,返回true
或false
。
let obj = { x: 1 };
console.log(Reflect.has(obj, 'x')); // 输出 true
-
函数调用相关:
Reflect.apply(target, thisArgument, argumentsList)
:对函数target
进行调用,thisArgument
作为函数执行时的this
值,argumentsList
是参数数组,和Function.prototype.apply()
功能类似。
function add(a, b) {
return a + b;
}
console.log(Reflect.apply(add, null, [1, 2])); // 输出 3
Reflect.construct(target, argumentsList[, newTarget])
:对构造函数target
进行new
操作,相当于执行new target(...argumentsList)
,可指定newTarget
来确定最终实例的原型。
function Person(name) {
this.name = name;
}
let alice = Reflect.construct(Person, ['Alice']);
console.log(alice.name); // 输出 Alice
-
属性定义与删除相关:
Reflect.defineProperty(target, propertyKey, attributes)
:和Object.defineProperty()
类似,用于定义或修改对象target
上属性propertyKey
的描述符attributes
,设置成功返回true
,否则返回false
。
let obj = {};
console.log(Reflect.defineProperty(obj, 'name', {
value: 'Bob',
writable: false
})); // 输出 true
Reflect.deleteProperty(target, propertyKey)
:作为函数形式的delete
操作符,删除对象target
上的属性propertyKey
,成功返回true
,失败返回false
。
let obj = { x: 1 };
console.log(Reflect.deleteProperty(obj, 'x')); // 输出 true
-
原型与描述符相关:
Reflect.getPrototypeOf(target)
:类似于Object.getPrototypeOf()
,返回对象target
的原型。Reflect.setPrototypeOf(target, prototype)
:设置对象target
的原型为prototype
,设置成功返回true
,失败返回false
。Reflect.getOwnPropertyDescriptor(target, propertyKey)
:类似于Object.getOwnPropertyDescriptor()
,如果对象target
中存在属性propertyKey
,则返回对应的属性描述符,否则返回undefined
。
-
其他:
Reflect.isExtensible(target)
:类似于Object.isExtensible()
,判断对象target
是否可扩展(是否可以添加新属性)。Reflect.preventExtensions(target)
:阻止向对象target
添加新属性,返回一个布尔值表示操作是否成功。Reflect.ownKeys(target)
:返回一个包含对象target
所有自身属性(不包含继承属性)的数组,不受属性enumerable
特性影响。
handler 对象方法(与 Reflect 静态方法对应)
在使用 Proxy
时,handler
对象是用于定义代理行为的配置对象,其方法与 Reflect
的静态方法命名相同,功能也类似,用于拦截对象的各种操作:
handler.get(target, propertyKey, receiver)
:拦截对象属性的读取操作,和Reflect.get
类似,参数意义相同。handler.set(target, propertyKey, value, receiver)
:拦截对象属性的设置操作,对应Reflect.set
。handler.has(target, propertyKey)
:拦截in
操作符,对应Reflect.has
。handler.apply(target, thisArgument, argumentsList)
:拦截函数调用,对应Reflect.apply
。handler.construct(target, argumentsList, newTarget)
:拦截new
操作,对应Reflect.construct
。handler.defineProperty(target, propertyKey, attributes)
:拦截对象属性的定义操作,对应Reflect.defineProperty
。handler.deleteProperty(target, propertyKey)
:拦截delete
操作,对应Reflect.deleteProperty
。handler.getPrototypeOf(target)
:拦截获取对象原型的操作,对应Reflect.getPrototypeOf
。handler.setPrototypeOf(target, prototype)
:拦截设置对象原型的操作,对应Reflect.setPrototypeOf
。handler.getOwnPropertyDescriptor(target, propertyKey)
:拦截获取对象属性描述符的操作,对应Reflect.getOwnPropertyDescriptor
。handler.isExtensible(target)
:拦截判断对象是否可扩展的操作,对应Reflect.isExtensible
。handler.preventExtensions(target)
:拦截阻止对象扩展的操作,对应Reflect.preventExtensions
。handler.ownKeys(target)
:拦截获取对象自身属性键的操作,对应Reflect.ownKeys
。