Reflect对象的设计目的
- Reflect对象上可以拿到语言内部的方法(现在Object也能,但是之后Reflect只有才能拿到)
- 比Object的写法更规范
- 让Object操作都变成函数行为
- Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。
Reflect的13个静态方法
Reflect.apply(target, thisArg, args)
Reflect.construct(target, args)
Reflect.get(target, name, receiver)
Reflect.set(target, name, value, receiver)
Reflect.defineProperty(target, name, desc)
Reflect.deleteProperty(target, name)
Reflect.has(target, name)
Reflect.ownKeys(target)
Reflect.isExtensible(target)
Reflect.preventExtensions(target)
Reflect.getOwnPropertyDescriptor(target, name)
Reflect.getPrototypeOf(target)
Reflect.setPrototypeOf(target, prototype)
var myObject = {
foo: 1,
bar: 2,
get baz() {
return this.foo + this.bar;
}
}
var myReceiverObject = {
foo: 4,
bar: 4,
};
- Reflect.get(obj, name, receiver)
Reflect.get(myObject, 'foo')
Reflect.get(myObject, 'bar')
Reflect.get(myObject, 'baz')
Reflect.get(myObject, 'san')
Reflect.get(myObject, 'baz', myReceiverObject)
Reflect.get(myObject, 'bar', myReceiverObject)
Reflect.get(1, 'foo')
Reflect.get(false, 'foo')
- Reflect.set(obj, name, value, receiver)
Reflect.set(myObject, 'foo', 2)
Reflect.set(myObject, 'san', 2)
Reflect.set(1, 'foo', {})
Reflect.set(false, 'foo', {})
var myObject = {
foo: 4,
set bar(value) {
return this.foo = value;
},
};
var myReceiverObject = {
foo: 0,
};
Reflect.set(myObject, 'bar', 1, myReceiverObject);
myObject.foo
myObject.bar
myReceiverObject.foo
myReceiverObject.bar
- Reflect.has(obj, name) 对应
name in obj 的运算
'foo' in myObject
Reflect.has(myObject, 'foo')
- Reflect.deleteProperty(obj, name) 对应 delete obj[name]
delete myObject.foo
Reflect.deleteProperty(myObject, 'foo')
- Reflect.construct(Obj, args) 对应 new Obj(...args)
function Person(name) {
this.name = name
}
let ming = new Person('xiaoming')
let hong = Reflect.construct(Person, ['xiaoming'])
- Reflect.getPrototypeOf(obj) 对应 Object.getPrototypeOf(obj)
Reflect.getPrototypeOf(ming) === Object.getPrototypeOf(ming) === Reflect.getPrototypeOf(hong)
- Reflect.setPrototypeOf(obj, newProto) 对应 Object.setPrototypeOf(obj, newProto)
obj 是 undefined或null,均报错。
obj 是 不是对象,Reflect 报错,Object 返回 obj值
const myObj = {};
Object.setPrototypeOf(myObj, Array.prototype);
Reflect.setPrototypeOf(myObj, Array.prototype);
myObj.length
- Reflect.apply(func, thisArg, args) 对应
Function.prototype.apply.call(func, thisArg, args) 和 fn.apply(thisArg, args)
let name = 1
Object.prototype.toString.call(name)
Reflect.apply(Object.prototype.toString, name, [])
- Reflect.defineProperty(target, propertyKey, attributes) 对应
Object.defineProperty(target, propertyKey, attributes)
function myData() {}
Object.defineProperty(myData, 'now', { value: () => Date.now() })
Reflect.defineProperty(myData, 'now', { value: () => Date.now() })
const p = new Proxy({}, {
defineProperty(target, prop, descriptor) {
console.log(descriptor);
return Reflect.defineProperty(target, prop, descriptor);
}
});
p.foo = 'bar';
p.foo
- Reflect.getOwnPropertyDescriptor(target, propertyKey) 对应
Object.getOwnPropertyDescriptor
var myObject = {};
Object.defineProperty(myObject, 'hidden', {
value: true,
enumerable: false,
});
Object.getOwnPropertyDescriptor(myObject, 'hidden');
Reflect.getOwnPropertyDescriptor(myObject, 'hidden');
- Reflect.isExtensible (target) 对应
Object.isExtensible 是否可扩展, 返回布尔值
const myObject = {};
Object.isExtensible(myObject)
Reflect.isExtensible(myObject)
- Reflect.preventExtensions (target) 对应
Object.preventExtensions 让一个对象变为不可扩展
var myObject = {};
Object.preventExtensions(myObject)
Reflect.preventExtensions(myObject)
- Reflect.ownKeys方法用于返回对象的所有属性,基本等同于Object.getOwnPropertyNames与Object.getOwnPropertySymbols之和。
var myObject = {
foo: 1,
bar: 2,
[Symbol.for('baz')]: 3,
[Symbol.for('bing')]: 4,
};
// 旧写法
Object.getOwnPropertyNames(myObject) // ['foo', 'bar']
Object.getOwnPropertySymbols(myObject) //[Symbol(baz), Symbol(bing)]
Reflect.ownKeys(myObject) // ['foo', 'bar', Symbol(baz), Symbol(bing)] 新写法