Pierwszy rzut oka na obiekt Reflect w programowaniu obiektowym w JavaScript. Powoli poznajemy bardziej zaawansowane elementy języka. Do dzieła.
Pamiętamy przykład z poprzedniej lekcji o Proxy?
const PersonProxy = new Proxy(Person, {
apply(target, thisArg, argumentsList){
return new target(...argumentsList);
}
})
let p2 = PersonProxy("Jane", 20);
console.log(p2);
//Object { name: "Jane", age: 20 }
Ok, przepiszemy to sobie na Reflext.construct:
class Person {
constructor(name, age){
this.name = name;
this.age = age;
}
}
let person = new Person("John", 33)
console.log(person);
//Object { name: "John", age: 33 }
const PersonProxy = new Proxy(Person, {
apply(target, thisArg, argumentsList){
return Reflect.construct(Person, argumentsList);
}
})
let p2 = PersonProxy("Jane", 20);
console.log(p2);
//Object { name: "Jane", age: 20 }
Reflect.construct może:
- Pożyczać konstruktory z funkcji-konstruktorów (patrz call i dziedziczenie w stylu ES5, przerabialiśmy już to)
- Wykorzystywać konstruktory klas, działając tak jak new NazwaKlasy
- Może pożyczyć konstruktor z jednej klasy, tworząc instancję innej klasy (poza Reflect niemożliwe w klasach ES6)
Przykład mamy w dokumentacji MDN:
function OneClass() {
this.name = "one";
}
function OtherClass() {
this.name = "other";
}
const args = [];
const obj1 = Reflect.construct(OneClass, args, OtherClass);
const 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
Mamy tutaj dwa sposoby na to, aby z jednego konstruktora skorzystać, obiekt innej klasy utworzyć.
Oczywiście to nie jest główne użycie obiektu Reflect. Najczęściej używać będziemy:
- Reflect.get
- Reflect.set
- Reflect.has
- Reflect.ownKeys
Dokładniej przyjrzymy się Reflect w następnych lekcjach.