The short answer : Mimic classes and code organization!
It mimics classes for code encapsulation - not inheritence per se.
Javascript has prototypal inheritence, where we can dynamically add members to the prototype property of the class/object we define. The members added are shared across all instances of classes created AFTER we have defined the prototype members - akin to static members. The members defined if any, in the class(function) itself belong to individual instances with reference to the "this" keyword.
A module can be a distinct unit of functionality, like a navigation module, a filter module, an email notification module etc. We can think of it as a JavaScript equivalent of a .NET component. Decomposing your code into modules helps maintainability of your application by keeping them loosely coupled and removing dependencies where possible.
- Allows encapsulation of private members giving it an object-oriented flavor
- Avoids function name clashes with other parts of the JavaScript code
- So helps in code organization
- By immediately invoking the function expression, returns only the object container or function with the values of the private members remembered through closure. So returns only a public API in the forma of an object, keeping everything else private using closure.
- Very similar to IIFE, except an object is returned, rather than a function.
var module = (function () {
var privateVariable; //private member
/* a private function uses the private variable in a closure .. (read nested function)
Allows the private member to be declared (and initialized) only once and exposed indirectly
without polluting the global namespace */
var privateFunction = function (x) {
/* uses the private variable */
};
/* Another private function - just named public here because we are going to expose it outside
the module defintion */
var publicFunction = function () {
privateFunction (); /* Can call the private function */
};
/* returns an object literal */ return {
PublicFunction : publicFunction /* exposed as a public function here! */
}
}()); /* Outer function is immediately executed here */
/* Note that this is a Singleton pattern as it is immediately executed here, and we cannot create
multiple instances of this module */
In Modern JavaScript design patterns, these 4 object-oriented design patterns
- Prototype Pattern
- Module Pattern
- Revealing Module Pattern
- Revealing Prototype Pattern
can be implemented using
- AMD - allows modules to be loaded asynchronously without care for script loading order
- CommonJS module - Module dependencies have to worry about the order while loading script in browser
- ECMAScript Harmony - the next version of JavaScript!
No comments:
Post a Comment