A JavaScript pattern and antipattern code collection that covers function patterns, jQuery patterns, design patterns, general patterns, literals and constructor patterns, object creation patterns (upcoming), code reuse patterns (upcoming), DOM and browser patterns (upcoming).
Weekly roundups (pattern updates) will be regularly tweeted.
Function Patterns
API Patterns
- Callback patterns - when you pass function A to function B as a parameter, function A is a callback function
- Configuration objects - keep control of function arguments and makes it easily configurable
- Returning functions - one function returns another function or create another function on-demand
- Currying - used to create new functions dynamically by partially applying a set of arguments
Initialization patterns
- Immediate functions - syntax that enables function execution as soon as it is defined
- Immediate object initialization - this pattern is mainly suitable for one-off tasks
- Init-time branching - branch code once during initlization initialization
Performance patterns
- Memoization - use function properties to avoid repeated computation
- Self-defining functions - self-overwrite with new bodies to do less work from the second invocation and after
jQuery Patterns
- requery - avoid requery by using jQuery chaining
- append - use string concatenate and set innerHTML
- data - pattern and antipattern of using data
- context and find - use find over context
- detach - take element off the DOM while manipulating them
- event delegation - event delegation pattern and antipattern
- selector cache - using selector cache to avoid requery
- window scroll event - avoid attaching handlers to the window scroll event
Selector
- Left and Right - specific on the right, light on the left
- Decending from id - be more specific
- Universal Selector - use of universal selector
- Be Specific when Needed - be specific only when needed
Literals and Constructors Patterns
- Object literal - use the simpler and reliable object literal instead of new Object();
- Enforcing new - when you forget `new`, `this` inside the constructor will point to the global object
- Array literal - use array literal notation to avoid potential errors when creating dynamic arrays at runtime
- Working with JSON - use library from JSON.org, YUI, jQuery instead of eval for parsing
- Primitive wrappers - try to use the primitive without wrapper
- Regular expression literal - try to use the shorter literal notation
Design Patterns
Creational
- Builder - constructs complex objects by separating construction and representation
- Factory method - creates objects without specifying the exact class to create
- Singleton - restricts object creation for a class to only one instance
Structural
- Decorator - dynamically adds/overrides behaviour in an existing method of an object
- Facade - provides a simplified interface to a large body of code
- Proxy - provides a placeholder for another object to control access, reduce cost, and reduce complexity
Behavioral
- Chain of responsibility - delegates commands to a chain of processing objects
- Command - creates objects which encapsulate actions and parameters
- Iterator - implements a specialized language
- Mediator - allows loose coupling between classes by being the only class that has detailed knowledge of their methods
- Observer - is a publish/subscribe pattern which allows a number of observer objects to see an event
- Strategy - allows one of a family of algorithms to be selected on-the-fly at runtime
General Patterns
- Minimizing Globals - create and access a global variable in a browser environment
- The Problem with Globals - various problems with globals
- Access to the Global Object - access the global object without hard-coding the identifier window
- Single var Pattern - use one var statement and declare multiple variables
- Hoisting - var statements anywhere in a function act as if the variables were declared at the top of the function
- for loops - optimized for loops
- for-in loops - optimized for-in loops
- (Not) Augmenting Built-in Prototypes - only augment built-in prototypes when certain conditions are met
- switch Pattern - improve the readability and robustness of your switch statements
- Implied Typecasting - avoid implied typecasting
- Avoiding eval() - avoid using eval()
- Number Conversions with parseInt() - use the second radix parameter
- Conditionals - pattern and antipattern of using if else
References
-
The Essentials of Writing High Quality JavaScript
http://net.tutsplus.com/tutorials/javascript-ajax/the-essentials-of-writing-high-quality-javascript/ -
JSPatterns
http://www.jspatterns.com/ -
jQuery Anti-Patterns for Performance & Compression
http://paulirish.com/2009/perf/ -
How DRY Affects JavaScript Performance
http://velocityconf.com/velocityeu/public/schedule/detail/21634 -
Object Oriented JavaScript
http://www.packtpub.com/object-oriented-javascript/book -
JavaScript Patterns
http://shop.oreilly.com/product/9780596806767.do -
JavaScript: The Good Parts
http://shop.oreilly.com/product/9780596517748.do -
Pro JavaScript Design Patterns
http://jsdesignpatterns.com/ -
Essential JavaScript Design Patterns For Beginners, Volume 1.
http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/ -
Eloquent JavaScript
http://eloquentjavascript.net/