Builder - garevna/js-course GitHub Wiki

ico25 Builder

Чем шаблон строитель отличается от фабрики:

cap

function userBuilder ( userName = "", birthday = "", speciality = "", hobby = "" ) {
    const user = {
        defaultData: new Date( 2000, 10, 15 ).toLocaleString().split(", ")[0],
        family: {
            mother: {},
            father: {},
            sisters: [],
            brothers: [],
            wife: {},
            children: []
        }
    }

    user.setName = function ( name ) {
        this.fullName = name
    }

    user.setMotherName = function ( name ) {
        this.family.mother.fullName = name
    }
    user.setFatherName = function ( name ) {
        this.family.father.fullName = name
    }
    user.createNewHuman = function ( params ) {
        params = params ? params : {}
        params.name = params.name ? params.name : ""
        params.birthday = params.birthday ? params.birthday : this.defaultData
        params.speciality = params.speciality ? params.speciality : ""
        return {
            name: params.name,
            birthday: params.birthday,
            speciality: params.speciality
        }
    }
    user.addFamilyMember = function ( role, memberParams ) {
        if ( Object.keys( this.family ).indexOf ( role ) < 0 ) return
        
        Array.isArray( this.family [ role ] ) ?
            this.family [ role ].push ( this.createNewHuman ( memberParams )) : 
            this.family [ role ] = this.createNewHuman ( memberParams )
    }
    
    let newUser = Object.create ( user )
    newUser.name = userName
    newUser.birthday = birthday
    newUser.speciality = speciality
    newUser.hobby = hobby
    return newUser
}

var user1 = userBuilder ( "Henry", "05/09/200", "developer", "fishing" )

user1.addFamilyMember ( "mother", { name: "Mary", birthday: "04/08/1974", speciality: "teacher" } )
user1.addFamilyMember ( "sisters", { name: "Helen", birthday: "04/08/1998", speciality: "student" } )