Last active
November 10, 2016 12:51
-
-
Save dwiyatci/e7c5bc7b1452af5864795de627707f5f to your computer and use it in GitHub Desktop.
Favoring factory pattern over constructor pattern in JavaScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//////////// constructor pattern | |
function Employee() { | |
this.name = ''; | |
this.salary = 0; // no real encapsulation of private property | |
} | |
// too much code noises and bugs-prone from `prototype` and `this` | |
Employee.prototype.getSalary = function () { | |
return this.salary; | |
}; | |
Employee.prototype.setSalary = function (salary) { | |
if (salary > 0) { | |
this.salary = salary; | |
} | |
}; | |
Employee.prototype.print = function () { | |
console.log('name: %s, salary: %d', this.name, this.salary); | |
}; | |
//////////// factory pattern | |
function EmployeeFactory() { | |
var salary = 0; // private | |
var employee = { | |
name: '', // public | |
getSalary: getSalary, | |
setSalary: setSalary, | |
print: print | |
}; | |
return employee; | |
//////////// implementation details | |
// free yourself from `prototype` and `this` mess which usually becomes the source of bugs ;) | |
function getSalary() { | |
return salary; | |
} | |
function setSalary(n) { | |
if (n > 0) { | |
salary = n; | |
} | |
} | |
function print() { | |
console.log('name: %s, salary: %d', employee.name, salary); | |
} | |
} | |
//////////// test | |
var employee = new Employee(); | |
employee.name = 'jaroslaw'; | |
employee.setSalary(5000); | |
employee.salary = -5000; // oops.. leaking private property :( | |
employee.print(); // name: jaroslaw, salary: -5000 | |
var employee1 = EmployeeFactory(); // no need to worry about forgetting calling `new` | |
employee1.name = 'glenn'; | |
employee1.setSalary(1000); | |
employee1.salary = -1000; // private is safe by closure | |
employee1.print(); // name: glenn, salary: 1000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment