dimanche 10 octobre 2021

Circular trap in Builder method while implementing in Javascript

I was trying to implement a Builder pattern in Javascript using modularity, where I got caught in a circular dependencies-like situation. My file structure looks something like this,

index.js

import PersonBuilder from "./PersonBuilder.js";

let pb = new PersonBuilder();

let person = pb.lives.in('jaipur').at('ajmer Road')
                .age.of(32).build();

Person.js

class Person
{
    constructor()
    {
        this.city = this.street = this.name = "";
        this.age = 0;
    }

    toString(){
        return `${this.name} from ${this.city} lives at ${this.street} is ${this.age} years old`;
    }
}

export default Person;

PersonBuilder.js

import  Person from "./Person.js";
import  PersonAgeBuilder from "./PersonAgeBuilder.js";
import PersonAddressBuilder from "./PersonAddressBuilder.js";

class PersonBuilder 
{
    constructor(person = new Person)
    {
        this.Person = person;
    }

    get lives()
    {
        return new PersonAddressBuilder(this.person);
    }
    get age()
    {
        return new PersonAgeBuilder(this.person);
    }
    build()
    {
        return this.person;
    }
}

export default PersonBuilder;

PersonAddressBuilder.js

import  PersonBuilder from "./PersonBuilder.js";

class PersonAddressBuilder extends  PersonBuilder
{
    constructor(person)
    {
        super(person);
    }
    in(city){
        this.person.city = city;
        return this;
    }
    at(street)
    {
        this.person.street = street;
        return this;
    }
}

export default PersonAddressBuilder;

PersonAgeBuilder.js

import  PersonBuilder from "./PersonBuilder.js";


 class PersonAgeBuilder extends PersonBuilder
{
    constructor(person)
    {
        super(person);
    }
    of(age){
        this.person.age = age;
    }
}

export default PersonAgeBuilder;

When I am calling index.js on my browser I got the following error:

Uncaught ReferenceError: Cannot access 'PersonBuilder' before initialization at PersonAgeBuilder.js:4

how can I solve this?

Aucun commentaire:

Enregistrer un commentaire