是什么:
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers的方法相同。Reflect不是一个函数对象,因此它是不可构造的。
与大多数全局对象不同Reflect并非一个构造函数,所以不能通过new运算符对其进行调用,或者将Reflect对象作为一个函数来调用。Reflect的所有属性和方法都是静态的(就像Math对象)。
为什么:
Reflect主要是和Proxy配对使用,提供对象语义的默认行为。
let p = new Proxy({}, {
set(...args) {
return Reflect.set(...args);
}
})
p.name = 'lxf'
console.log(p); // { name: 'lxf' }
怎么做:
静态方法
-
Reflect.apply(target, thisArgument, argumentsList)
对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和
Function.prototype.apply()功能类似。 -
Reflect.construct(target, argumentsList[, newTarget])
对构造函数进行
new操作,相当于执行new target(...args)。 -
Reflect.defineProperty(target, propertyKey, attributes)
和
Object.defineProperty()类似。如果设置成功就会返回true -
Reflect.deleteProperty(target, propertyKey)
作为函数的
delete操作符,相当于执行delete target[name]。 -
Reflect.get(target, propertyKey[, receiver])
获取对象身上某个属性的值,类似于
target[name]。 -
Reflect.getOwnPropertyDescriptor(target, propertyKey)
类似于
Object.getOwnPropertyDescriptor()。如果对象中存在该属性,则返回对应的属性描述符, 否则返回undefined. -
Reflect.getPrototypeOf(target)
-
Reflect.has(target, propertyKey)
判断一个对象是否存在某个属性,和
in运算符 的功能完全相同。 -
Reflect.isExtensible(target)
-
Reflect.ownKeys(target)
返回一个包含所有自身属性(不包含继承属性)的数组。(类似于
Object.keys(), 但不会受enumerable影响). -
Reflect.preventExtensions(target)
类似于
Object.preventExtensions()。返回一个Boolean。 -
Reflect.set(target, propertyKey, value[, receiver])
将值分配给属性的函数。返回一个
Boolean,如果更新成功,则返回true。 -
Reflect.setPrototypeOf(target, prototype)
设置对象原型的函数. 返回一个
Boolean, 如果更新成功,则返回true。
Examples
检测一个对象是否存在特定属性
const duck = {
name: 'Maurice',
color: 'white',
greeting: function() {
console.log(`Quaaaack! My name is ${this.name}`);
}
}
Reflect.has(duck, 'color');
// true
Reflect.has(duck, 'haircut');
// false
返回这个对象自身的属性
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
为这个对象添加一个新的属性
Reflect.set(duck, 'eyes', 'black');
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"
注意点:
静态方法和非静态方法的区别
静态方法和非静态方法的区别总结如下:
1、静态方法属于类所有,类实例化前即可使用;
2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员;
3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存;
4、static内部只能出现static变量和其他static方法!而且static方法中还不能使用this等关键字,因为它是属于整个类;
5、静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;
6、静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
主要区别:静态方法在创建对象前就可以使用了,非静态方法必须通过new出来的对象调用。