-
操作对象
Object.definePropertydeletein等集中在Reflect的静态方法上
目的
-
将
Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上 -
从
Reflect对象上可以拿到语言内部的方法-
某些方法同时在
Object和Reflect对象上部署 -
未来的新方法将只部署在
Reflect对象上
-
-
修改某些
Object方法的返回结果,让其变得更合理
// 老写法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
-
将命令式操作转变为函数调用,避免更多的保留字占用
- 如
name in obj和delete obj[name],对应Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)
- 如
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
-
Reflect对象的方法与Proxy对象handler的方法是一一对应的- 想要调用默认行为,直接在
Reflect上调用同名方法
- 想要调用默认行为,直接在
let proxy = new Proxy({}, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target, name, value, receiver);
if (success) {
console.log('property ' + name + ' on ' + target + ' set to ' + value);
}
return success;
}
});
静态方法
-
Reflect.apply(target, thisArg, 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)
Reflect.construct(target, args)
-
实例化一个对象
-
用可变的参数来调用构造函数
var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
- 比较:指定构造函数和原型对象(使用
Object.create())来创建一个对象的
function OneClass() {
this.name = 'one';
}
function OtherClass() {
this.name = 'other';
}
// 创建一个对象:
var obj1 = Reflect.construct(OneClass, args, OtherClass);
// 与上述方法等效:
var obj2 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);
console.log(obj1.name); // 'one'
console.log(obj2.name); // 'one'
console.log(obj1 instanceof OneClass); // false
console.log(obj2 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // true
console.log(obj2 instanceof OtherClass); // true
-
Object.create()和Function.prototype.apply():如果不使用new操作符调用构造函数,构造函数内部的new.target值会指向undefined -
Reflect.construct()来创建对象:new.target值会自动指定到target(或者 newTarget,前提是 newTarget 指定了)
function OneClass() {
console.log('OneClass');
console.log(new.target);
}
function OtherClass() {
console.log('OtherClass');
console.log(new.target);
}
var obj1 = Reflect.construct(OneClass, args);
// 输出:
// OneClass
// function OneClass { ... }
var obj2 = Reflect.construct(OneClass, args, OtherClass);
// 输出:
// OneClass
// function OtherClass { ... }
var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// 输出:
// OneClass
// undefined
- 示例
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776