Note: This isn’t quite OOP. It’s actually called the “module pattern”.
If you come from a language such as Python, PHP, or Java, you’re used to having public and private methods and variables. In Javascript this is possible too, but it’s not nearly as straight-forward. To make this happen, you usually need to wade through Javascript’s prototype inheritance. However, there is another way.
Step 1: Create your class.
function MyClass(somevar) { } |
Now that your class is created, you can instantiate an instance of it by doing the following:
var x = new MyClass(123); |
Step 2: Public Methods and Properties
To expose properties and methods to the public, you need to attach them to an object and return it. Some people will attach to this, but I prefer to create a new object called self and return that. It keeps me from getting confused with what this scope I’m in. One thing to remember, is that anything inside of your class that isn’t in a function gets executed as soon as you create a new instance of it.
function MyClass(somevar) { var self = {}; // Check to make sure somevar is defined and then // assign it to the my_property public property. if(somevar === undefined) { somevar = false; } self.my_property = somevar; // A public method! self.alert_loop = function(count) { if(count === undefined) { count = 1; } for(var i = 0; i < count; i++) { alert(self.my_property); } }; return self; } |
You’ll see that we have two things exposed here: my_property and alert_loop. To access them, do this:
var x = new MyClass("Hi!"); alert(x.my_property); // Alerts "Hi!" x.alert_loop(2); // Alerts "Hi!" twice |
Step 3: Private Methods and Variables
Creating private methods and variables is very easy using this method Javascript OOP. All you do is not attach the variable or method to the self object.
function MyClass(somevar) { var self = {}; /* Private */ var loop_max = 2; function add_numbers(x,y) { return x + y; } /* Public stuff */ if(somevar === undefined) { somevar = false; } self.my_property = somevar; self.alert_loop = function(count) { if(count === undefined) { count = 1; } for(var i = 0; i < count; i++) { alert(self.my_property); } }; self.alert_numbers = function() { for(var i = 0; i < loop_max; i++) { alert(add_numbers(i,i+1)); } }; return self; } |
And to use it:
var x = new MyClass("Hi!"); x.add_numbers(1,2); // Will fail. alert(x.loop_max); // Will fail. x.alert_numbers(); // works! |
Conclusion
That’s it! Using this style of OOP in Javascript is easy to learn and easy to understand. If you have any questions, drop a comment and I’ll get back to you.
7 replies on “Methods & Properties with Javascript OOP”
Props for the var self trick. Great post.
Very nice example. Can we see an equivalent example using prototypes instead of self? Thanks!
Could you please write something like that for polymorphism and inheritance?
By returning a new object instead of `this` you are killing the inherited prototype.
Yeah, I don’t get that. Why assign a new, empty object to self rather than assigning this to self? Or is there a clever trick I’m missing there…
I usually only do this so that I know exactly what’s being returned to the caller. However, I like the idea of assigning self = this when you need the inherited prototype.
One thing to be cautious of here is… these aren’t exactly private variables and functions as you’d think of them in Java. They are accessible to the functions declared after them here because when you define those functions you create closures, giving them access to everything that is in the current scope. If you add new methods to your object at a later date, they won’t have access to the private variables and functions, because that scope will have been closed.