ES 6のReflectは知っている必要がありますか?
4681 ワード
Reflectとは
ES 6は、オブジェクトを操作するために提供される新しいAPIのために、将来の新しい方法はReflectオブジェクトのみに展開されます.
初探Reflect
ReflectとProxyは相補的であり、Proxyオブジェクトの方法であれば、Reflectオブジェクトに対応する方法を見つけられます.
Reflectオブジェクトは全部で13の静的な方法があります.私たちは順次古い書き方と新しい書き方を比較します.
1.Reflect.get
オブジェクト中の対応するkeyの値を取得します.
オブジェクトのkeyに対応する値を設定します.
あるキーがこのオブジェクトに属するかどうかを判断する.
オブジェクトの属性と値を定義すると、Object.definePropertyに相当します.
オブジェクトの属性を削除します.
実用化クラスは、newに等しい.
プロトを読み込むと、Object.get ProttypeOfに相当しますが、方法が伝達されるのが対象でないとエラーが発生します.
設定プロトは、Object.set ProttotypeOfに相当しますが、設定が成功したかどうかを示すbootタイプに戻るかは異なります.
きっとappy方法はみんなよく知っています.Reflect.appyはFunction.prototype.apple.callに相当します.
Object.getOwn PropertyDescriptorに相当し、属性記述オブジェクトを取得する.
オブジェクトを拡張することはできません.つまり、新しい属性を追加することはできません.Object.prevent Extensに相当します.
現在のオブジェクトが拡張可能かどうかを表します.
オブジェクトのすべての属性を返します.Symbol属性を含みます.
ES 6は、オブジェクトを操作するために提供される新しいAPIのために、将来の新しい方法はReflectオブジェクトのみに展開されます.
初探Reflect
ReflectとProxyは相補的であり、Proxyオブジェクトの方法であれば、Reflectオブジェクトに対応する方法を見つけられます.
const obj = { name: "song" };
const proxy = new Proxy(obj, {
get(target, name) {
// reflect
return Reflect.get(target, name);
},
set(target, name, value) {
return Reflect.set(target, name, value);
},
has(target, name) {
// in has
return Reflect.has(target, name);
}
});
// reflect
console.log("name" in proxy);
console.log(Reflect.has(proxy, "name")); // Reflect
Reflect静的方法Reflectオブジェクトは全部で13の静的な方法があります.私たちは順次古い書き方と新しい書き方を比較します.
1.Reflect.get
オブジェクト中の対応するkeyの値を取得します.
const my = {
name:'song',
age:18,
get mny(){
return this.a + this.b
}
}
console.log(my['age']); //
console.log(Reflect.get(my,'age'));
console.log(Reflect.get(my,'mny',{a:1,b:2})); // this
2.Reflect.setオブジェクトのkeyに対応する値を設定します.
const my = {
name: "song",
age: 18,
set mny(val) {
this.value = val;
}
};
let mny = { value: 0 };
my.mny = 100; //
Reflect.set(my, "mny", 100);
Reflect.set(my, "mny", 100, mny); // , this
console.log(mny); // {value:100}
3.Reflect.hasあるキーがこのオブジェクトに属するかどうかを判断する.
const my = {
name:'song'
}
console.log('name' in my);
console.log(Reflect.has(my,'name'));
4.Reflect.definePropertyオブジェクトの属性と値を定義すると、Object.definePropertyに相当します.
const person = {};
Object.defineProperty(person,'name',{
configurable:false,
value:'song'
});
console.log(person.name); // ,
Reflect.defineProperty(person,'name',{
configurable:false,
value:'song'
})
console.log(person.name);
5.Reflect.deletePropertyオブジェクトの属性を削除します.
const person = {};
Reflect.defineProperty(person,'name',{
configurable:false,
value:'song'
});
// delete person.name;
const flag = Reflect.deleteProperty(person,'name');
console.log(flag); //
6.Reflect.co.nstruct実用化クラスは、newに等しい.
class Person{
constructor(sex){
console.log(sex);
}
}
new Person(' '); //
Reflect.construct(Person,[' ']);
7.Reflect.get ProttypeOfプロトを読み込むと、Object.get ProttypeOfに相当しますが、方法が伝達されるのが対象でないとエラーが発生します.
class Person {}
//
console.log(Object.getPrototypeOf(Person) === Reflect.getPrototypeOf(Person));
8.Reflect.set ProttypeOf設定プロトは、Object.set ProttotypeOfに相当しますが、設定が成功したかどうかを示すbootタイプに戻るかは異なります.
let person = {name:'song'};
let obj = {age:18};
// Object.setPrototypeOf(person,obj); //
Reflect.setPrototypeOf(person,obj);
console.log(person.age);
9.Reflect.applyきっとappy方法はみんなよく知っています.Reflect.appyはFunction.prototype.apple.callに相当します.
const func = function(a,b){
console.log(this,a,b);
}
func.apply = () =>{
console.log('apply')
}
// func.apply({name:'song'},[1,2]); //
Function.prototype.apply.call(func,{name:'song'},[1,2]); //
Reflect.apply(func,{name:'song'},[1,2]); // !
10.Reflect.getOwn PropertyDescripterObject.getOwn PropertyDescriptorに相当し、属性記述オブジェクトを取得する.
const obj = {name:1};
// const descriptor = Object.getOwnPropertyDescriptor(obj,'name'); //
const descriptor = Reflect.getOwnPropertyDescriptor(obj,'name');
console.log(descriptor);
11.Reflect.prevent Extensionsオブジェクトを拡張することはできません.つまり、新しい属性を追加することはできません.Object.prevent Extensに相当します.
const person = {};
//
Object.preventExtensions(person); //
Reflect.preventExtensions(person);
person.a = 1;
console.log(person.a); // undefined
12 Reflect.isExtensioble現在のオブジェクトが拡張可能かどうかを表します.
const person = {};
Reflect.preventExtensions(person);
Object.isExtensible(person) // false
Reflect.isExtensible(person) // false
13.Reflect.ownKeysオブジェクトのすべての属性を返します.Symbol属性を含みます.
const person = {
age:18,
[Symbol('name')]:'song'
};
console.log(Object.getOwnPropertyNames(person)); // [ 'age' ]
console.log(Object.getOwnPropertySymbols(person)); // [ Symbol(name) ]
console.log(Reflect.ownKeys(person)); // [ 'age', Symbol(name) ]
これで私達はReflectの使い方を全部説明しました.内容はもっと乾いています.実は核心は元からあるObjectの部分の方法をReflectの上に置いたので、難度は完全に見ていません!