Reflect
2019-11-12 本文已影响0人
Rui___
反射
es6有部分对象的方法 放到 Reflect 功能基本一致
// 1) get /set
const obj = {};
Reflect.set(obj,'name','zf'); // obj.name = zwf;
console.log(Reflect.get(obj,'name'));
// 2) has
// 老的写法
console.log('a' in {a:1});
// 新的写法
console.log(Reflect.has({a:1},'a'));
// 3)defineProperty
// 把对象上的属性get set 都给重写了
const obj = {a:1}
//Object.freeze(obj); // 这个属性就能不能配置了 冻结freeze
let flag = Reflect.defineProperty(obj,'a',{//修改成功或不成功有返回值
value:100
})
console.log(flag);
console.log(obj)
// 4)getOwnPropertyDescriptor
const obj = {a:1};
console.log(Reflect.getOwnPropertyDescriptor(obj,'a'));
// 5)ownKeys
let obj = {
a:1,
[Symbol()]:1
};
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.getOwnPropertySymbols(obj));
console.log(Reflect.ownKeys(obj))
// 6)
Reflect.setPrototypeOf
Reflect.getPrototypeOf
// 7) 函数的apply方法 bind call apply的区别 改变this指向
const fn = function(a,b){ // apply 支持多个参数传参
console.log(this,a,b);
}
//fn.apply(1,[2,5])//1:this a:2,b:5
fn.apply = function(){
console.log('apply')
}
//fn.apply(1,[2,5])//这里不执行了,会执行函数自己定义的apply
// 函数原型上的apply方法 让他执行
//fn.__proto__.apply(1,[2,5])//这样也找不到
// call 的特点 1) 是改this指向 让函数执行
//Function.prototype.apply.call(fn,1,[2,3]);//把apply 的this改成fn
Reflect.apply(fn,1,[2,3]); // 用原型上的apply方法 等价上述方法
//8 等同于new
class XXX{
constructor(name){
this.name = name
}
}
let xxx = Reflect.construct(XXX,['zdddfww']);
console.log(xxx); // new
//9)
Reflect.deleteProperty // delete obj.a 返回是否删除成功
//10)扩展不能添加属性
let obj = {}; // 扩展不能添加属性
Reflect.preventExtensions(obj)
obj.a = 1;
//11)判断是否可以扩展
console.log(Reflect.isExtensible(obj));