how do constrcutor functions work