Reflect

反射
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));

你可能感兴趣的:(Reflect)