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.