Pridá operáciu nad štruktúrou objektov bez zásahu do ich tried.
class Shape { accept(visitor) { throw new Error('abstraktná metóda'); }} class Circle extends Shape { constructor(r) { super(); this.r = r; } // Circle performs no operation. It hands over control and passes itself. accept(visitor) { visitor.visitCircle(this); }} class Square extends Shape { constructor(a) { super(); this.a = a; } accept(visitor) { visitor.visitSquare(this); }} class Visitor { visitCircle(circle) { throw new Error('abstraktná metóda'); } visitSquare(square) { throw new Error('abstraktná metóda'); }} class AreaCalculator extends Visitor { visitCircle(circle) { return Math.PI * circle.r * circle.r; } visitSquare(square) { return square.a * square.a; }} const area = new AreaCalculator();circle.accept(area);square.accept(area);