反射
es6有部分對(duì)象的方法 放到 Reflect 功能基本一致
// 1) get /set
const obj = {};
Reflect.set(obj,'name','zf'); // obj.name = zwf;
console.log(Reflect.get(obj,'name'));
// 2) has
// 老的寫(xiě)法
console.log('a' in {a:1});
// 新的寫(xiě)法
console.log(Reflect.has({a:1},'a'));
// 3)defineProperty
// 把對(duì)象上的屬性get set 都給重寫(xiě)了
const obj = {a:1}
//Object.freeze(obj); // 這個(gè)屬性就能不能配置了 凍結(jié)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) 函數(shù)的apply方法 bind call apply的區(qū)別 改變this指向
const fn = function(a,b){ // apply 支持多個(gè)參數(shù)傳參
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])//這里不執(zhí)行了眠寿,會(huì)執(zhí)行函數(shù)自己定義的apply
// 函數(shù)原型上的apply方法 讓他執(zhí)行
//fn.__proto__.apply(1,[2,5])//這樣也找不到
// call 的特點(diǎn) 1) 是改this指向 讓函數(shù)執(zhí)行
//Function.prototype.apply.call(fn,1,[2,3]);//把a(bǔ)pply 的this改成fn
Reflect.apply(fn,1,[2,3]); // 用原型上的apply方法 等價(jià)上述方法
//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)擴(kuò)展不能添加屬性
let obj = {}; // 擴(kuò)展不能添加屬性
Reflect.preventExtensions(obj)
obj.a = 1;
//11)判斷是否可以擴(kuò)展
console.log(Reflect.isExtensible(obj));