<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>JSPatterns.com</title>
	<atom:link href="http://www.jspatterns.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jspatterns.com</link>
	<description>Exploring common JavaScript patterns and anti-patterns</description>
	<pubDate>Tue, 16 Feb 2010 08:05:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5-RC1</generator>
	<language>en</language>
			<item>
		<title>arguments considered harmful</title>
		<link>http://www.jspatterns.com/arguments-considered-harmful/</link>
		<comments>http://www.jspatterns.com/arguments-considered-harmful/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:04:42 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Coding practices]]></category>

		<category><![CDATA[arguments]]></category>

		<category><![CDATA[callee]]></category>

		<category><![CDATA[POLA]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=68</guid>
		<description><![CDATA[Inside every JavaScript function an arguments object is available containing all the parameters passed to the function. 

function aha(a, b) {
  console.log(arguments[0] === a); // true
  console.log(arguments[1] === b); // true
}

aha(1, 2);

However, it's not a good idea to use arguments for the reasons of :

performance
security

The arguments object is not automatically created every time [...]]]></description>
			<content:encoded><![CDATA[<p>Inside every JavaScript function an <code>arguments</code> object is available containing all the parameters passed to the function. </p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">aha</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">]</span><span class="hl-code"> === </span><span class="hl-identifier">a</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-brackets">]</span><span class="hl-code"> === </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> true</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">aha</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>However, it's not a good idea to use <code>arguments</code> for the reasons of :</p>
<ul>
<li>performance</li>
<li>security</li>
</ul>
<p>The <code>arguments</code> object is not automatically created every time the function is called, the JavaScript engine will only create it on-demand, if it's used. And that creation is not free in terms of performance. The difference between using arguments vs. not using it could be anywhere between <strong>1.5 times to 4 times slower</strong>, depending on the browser (<a href="http://webreflection.blogspot.com/2010/02/arguments-callee-call-and-apply.html">more info and bench</a>)</p>
<p>As for the security, there is the <a href="http://en.wikipedia.org/wiki/Principle_of_least_authority">POLA</a> (Principle of Least Authority) which is violated when one function A passes <code>arguments</code> to another B. Then a number of bad things can happen including:</p>
<ul>
<li>B calls A through arguments.callee - something A never intended when calling B in the first place</li>
<li>B overwrites some <code>arguments</code> and causes A to misbehave</li>
</ul>
<p>While in these scenarios B looks a little malicious, it can actually cause trouble unvoluntarilly. Consider this example that illustrates the second case (B changing values behind A's unsuspecting back)</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">A</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-code">, </span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">

  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> {p: 1}</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code">;  </span><span class="hl-comment">//</span><span class="hl-comment"> [1, 2, 3]</span><span class="hl-comment"></span><span class="hl-code">

  </span><span class="hl-identifier">B</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> oops!</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">obj</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> {p: 2}</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">ar</span><span class="hl-brackets">)</span><span class="hl-code">;  </span><span class="hl-comment">//</span><span class="hl-comment"> [1, 2]</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">B</span><span class="hl-brackets">(</span><span class="hl-identifier">args</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">

  </span><span class="hl-comment">//</span><span class="hl-comment"> convenient innocent-looking local vars</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">o</span><span class="hl-code">=</span><span class="hl-identifier">args</span><span class="hl-brackets">[</span><span class="hl-number">0</span><span class="hl-brackets">]</span><span class="hl-code">,
      </span><span class="hl-identifier">a</span><span class="hl-code">=</span><span class="hl-identifier">args</span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-brackets">]</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> do something with the local variables</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-identifier">o</span><span class="hl-code">.</span><span class="hl-identifier">p</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code">;
  </span><span class="hl-identifier">a</span><span class="hl-code">.</span><span class="hl-identifier">pop</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;

  </span><span class="hl-comment">//</span><span class="hl-comment"> now the original arguments is </span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-comment">//</span><span class="hl-comment"> messed up because objects/arrays</span><span class="hl-comment"></span><span class="hl-code">
  </span><span class="hl-comment">//</span><span class="hl-comment"> are passed by reference</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">A</span><span class="hl-brackets">(</span><span class="hl-brackets">{</span><span class="hl-identifier">p</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-brackets">}</span><span class="hl-code">, </span><span class="hl-brackets">[</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-number">3</span><span class="hl-brackets">]</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<h2>ECMAScript 5</h2>
<p>In ECMAScript's "strict mode", using <code>arguments.callee</code> will throw a syntax error.</p>
<h2>Recursive anonymous function</h2>
<p>Probably the biggest argument for keeping <code>arguments</code> and <code>arguments.callee</code> is so that recursive anonymous functions can be created, because by using the <code>callee</code> property a function can call itself without knowing its own name. Now, this is not such a common scenario, but even if so, you can wrap a named function inside of an anonymous function and voila! - call that named function recursively without leaking a variable to the global scope.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/arguments-considered-harmful/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Function properties</title>
		<link>http://www.jspatterns.com/function-properties/</link>
		<comments>http://www.jspatterns.com/function-properties/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:24:00 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[cache]]></category>

		<category><![CDATA[function properties]]></category>

		<category><![CDATA[memoization]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=67</guid>
		<description><![CDATA[Since functions are objects, and objects are mutable in JavaScript, you can add properties to your functions.
Why? For caching results of computations for example. Here's a memoization done this way.

function myFunc(param){
    if (!myFunc.cache) {
        myFunc.cache = {};
    }
    if [...]]]></description>
			<content:encoded><![CDATA[<p>Since functions are objects, and objects are mutable in JavaScript, you can add properties to your functions.</p>
<p>Why? For caching results of computations for example. Here's a memoization done this way.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">myFunc</span><span class="hl-brackets">(</span><span class="hl-identifier">param</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-code">!</span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-code">!</span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> ...</span><span class="hl-comment"></span><span class="hl-code">
        </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">result</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">myFunc</span><span class="hl-code">.</span><span class="hl-identifier">cache</span><span class="hl-brackets">[</span><span class="hl-identifier">param</span><span class="hl-brackets">]</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>Here <code>myFunc()</code> gets a <code>cache</code> property which is an object. The function does the complicated computations based on a parameter and ends up with a <code>result</code> object. Using the parameter as a key in the <code>cache</code> object, it stores the result.</p>
<p>Consecutive calls with the same parameter will get the result from the cache, no need to compute the same result again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/function-properties/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lazy definition function</title>
		<link>http://www.jspatterns.com/lazy-definition-function/</link>
		<comments>http://www.jspatterns.com/lazy-definition-function/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:20:10 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[lazy definition]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=66</guid>
		<description><![CDATA[This has a nice name – a lazy function definition. A lazy function is one that pretends to work but it doesn't really.
It does some work initially and then caches the result. Then on consecutive calls it only returns the pre-computed result, it doesn’t really do anything.
In order to do so, the function redefines itself [...]]]></description>
			<content:encoded><![CDATA[<p>This has a nice name – a lazy function definition. A lazy function is one that pretends to work but it doesn't really.</p>
<p>It does some work initially and then caches the result. Then on consecutive calls it only returns the pre-computed result, it doesn’t really do anything.</p>
<p>In order to do so, the function redefines itself with a new implementation, one that simply points to the computed result.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code"> + </span><span class="hl-number">2</span><span class="hl-code">;
    </span><span class="hl-identifier">lazy</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">result</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 4</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">lazy</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 4</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/lazy-definition-function/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Self-overwriting functions</title>
		<link>http://www.jspatterns.com/self-overwriting-functions/</link>
		<comments>http://www.jspatterns.com/self-overwriting-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:18:24 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[overwriting]]></category>

		<category><![CDATA[self-definition]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=65</guid>
		<description><![CDATA[Next pattern – a function that overwrites itself, a self-redefining function. Pretty similar to functions that return functions, but this time the function is re-implemented from the inside, not returned.

function next() {
    var count = 1;
    next = function() {
        return ++count;
 [...]]]></description>
			<content:encoded><![CDATA[<p>Next pattern – a function that overwrites itself, a self-redefining function. Pretty similar to functions that <a href="http://www.jspatterns.com/returning-functions/">return functions</a>, but this time the function is re-implemented from the inside, not returned.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code"> = </span><span class="hl-number">1</span><span class="hl-code">;
    </span><span class="hl-identifier">next</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> ++</span><span class="hl-identifier">count</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">

</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 2</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/self-overwriting-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Returning functions</title>
		<link>http://www.jspatterns.com/returning-functions/</link>
		<comments>http://www.jspatterns.com/returning-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:13:56 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=64</guid>
		<description><![CDATA[Functions are objects, so they can be passed around like callbacks for example and also returned by other functions. 
You call a function that does some complicated setup and as a results returns a new function. You assign the result to a new function and use it afterwards.

function setup() {
    alert(1);
  [...]]]></description>
			<content:encoded><![CDATA[<p>Functions are objects, so they can be passed around like callbacks for example and also returned by other functions. </p>
<p>You call a function that does some complicated setup and as a results returns a new function. You assign the result to a new function and use it afterwards.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">my</span><span class="hl-code"> = </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> alerts 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">my</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> alerts 2</span><span class="hl-comment"></span></pre>
</div>
<p>Your setup function can store some private data in a closure and use that data somehow.</p>
<p>Here <code>setup()</code> creates a counter function, which gives a next ID for example. But the <code>count</code> variable is not exposed.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">count</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">;
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
        </span><span class="hl-reserved">return</span><span class="hl-code"> ++</span><span class="hl-identifier">count</span><span class="hl-code">;
    </span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">next</span><span class="hl-code"> = </span><span class="hl-identifier">setup</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 1</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">next</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-comment">//</span><span class="hl-comment"> 2</span><span class="hl-comment"></span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/returning-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Callbacks</title>
		<link>http://www.jspatterns.com/callbacks/</link>
		<comments>http://www.jspatterns.com/callbacks/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 18:04:44 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[callback]]></category>

		<category><![CDATA[event]]></category>

		<category><![CDATA[timeout]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=63</guid>
		<description><![CDATA[Since functions are objects they can be passed as arguments to other functions.

function test(a, b, fn) {
    fn(a, b);
}

In this simple example we have a function test() that takes a function fn as a third parameter and calls that function passing the first two parameters.
When you cal the test() function, you can [...]]]></description>
			<content:encoded><![CDATA[<p>Since functions are objects they can be passed as arguments to other functions.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-code">, </span><span class="hl-identifier">fn</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">fn</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>In this simple example we have a function <code>test()</code> that takes a function <code>fn</code> as a third parameter and calls that function passing the first two parameters.</p>
<p>When you cal the <code>test()</code> function, you can pass a pointer to an existing function <code>myFunc()</code> or you can also pass an anonymous function.</p>
<div class="hl-main">
<pre><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-identifier">myFunc</span><span class="hl-brackets">)</span><span class="hl-code">;

</span><span class="hl-identifier">test</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-code">, </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">one</span><span class="hl-code">, </span><span class="hl-identifier">two</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<h3>Examples</h3>
<p>For examples of this pattern in the wild – well, every time you attach an event listener, you pass a callback function.</p>
<div class="hl-main">
<pre><span class="hl-builtin">document</span><span class="hl-code">.</span><span class="hl-identifier">addEventListener</span><span class="hl-brackets">(</span><span class="hl-code">
    </span><span class="hl-quotes">'</span><span class="hl-string">click</span><span class="hl-quotes">'</span><span class="hl-code">,
    </span><span class="hl-identifier">animateAndWowUser</span><span class="hl-code">,
    </span><span class="hl-reserved">false</span><span class="hl-code">
</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>Same with timeouts and intervals. <code>setTimeout()</code> and <code>setInterval()</code> expect a function and call it back after the specified number of milliseconds.</p>
<div class="hl-main">
<pre><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">thePlotThickens</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">console</span><span class="hl-code">.</span><span class="hl-identifier">log</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">500ms later...</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">;
</span><span class="hl-identifier">setTimeout</span><span class="hl-brackets">(</span><span class="hl-identifier">thePlotThickens</span><span class="hl-code">, </span><span class="hl-number">500</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>And here's a common anti-pattern – passing a string where a function is expected. The JavaScript engine has no choice but to evaluate the string (like with <code>eval()</code>) and execute it, which is unnecessary work.</p>
<div class="hl-main">
<pre><span class="hl-comment">//</span><span class="hl-comment"> anti-pattern</span><span class="hl-comment"></span><span class="hl-code">
</span><span class="hl-identifier">setTimeout</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">thePlotThickens()</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-number">500</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/callbacks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Self-executing functions</title>
		<link>http://www.jspatterns.com/self-executing-functions/</link>
		<comments>http://www.jspatterns.com/self-executing-functions/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:55:42 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[bookmarklet]]></category>

		<category><![CDATA[self-executing]]></category>

		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=62</guid>
		<description><![CDATA[Update: "Immediate functions" sounds like a much better name.
Self-executable functions are simple and powerful.
All you do is add a set of parentheses after the function and this causes it to be executed right there. If it’s an anonymous function you also need to wrap it in parentheses.

(function(){
   var a = 1;
   [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update</strong>: "Immediate functions" sounds like a much better name.</p>
<p>Self-executable functions are simple and powerful.</p>
<p>All you do is add a set of parentheses after the function and this causes it to be executed right there. If it’s an anonymous function you also need to wrap it in parentheses.</p>
<div class="hl-main">
<pre><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
   </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">a</span><span class="hl-code"> = </span><span class="hl-number">1</span><span class="hl-code">;
   </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">b</span><span class="hl-code"> = </span><span class="hl-number">2</span><span class="hl-code">;
   </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code"> + </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>You can also pass parameters to the self-executing function if you want.</p>
<div class="hl-main">
<pre><span class="hl-brackets">(</span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">c</span><span class="hl-code"> = </span><span class="hl-identifier">a</span><span class="hl-code"> + </span><span class="hl-identifier">b</span><span class="hl-code">;
  </span><span class="hl-identifier">alert</span><span class="hl-brackets">(</span><span class="hl-identifier">c</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span><span class="hl-brackets">(</span><span class="hl-number">1</span><span class="hl-code">, </span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>So how is this pattern useful? </p>
<p>It’s useful when you have some work to do, some initialization maybe. You need to do it only once and you don’t want to leave any globals lying around after the work is finished. All the temporary variables you need like <code>c</code> in the case above remain local and don't pollute the namespace.</p>
<p>Useful also when your code is kind of a guest to the page. Like a bookmarklet for example, or a widget of some sorts. You don’t want to add your variables and functions to the host page’s naming space and possibly causing a naming conflict with the page's core code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/self-executing-functions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Functions are objects</title>
		<link>http://www.jspatterns.com/functions-are-objects/</link>
		<comments>http://www.jspatterns.com/functions-are-objects/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:52:08 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Functions]]></category>

		<category><![CDATA[objects]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=61</guid>
		<description><![CDATA[Functions are objects, it’s very important to keep that in mind.
Functions are objects so they can have properties. And they they have methods.
They can be copied, deleted, passed as arguments to other functions, returned by other functions.
They also provide scope.
And they have special feature that sets them apart from the other objects – they are [...]]]></description>
			<content:encoded><![CDATA[<p>Functions are objects, it’s very important to keep that in mind.</p>
<p>Functions are objects so they can have properties. And they they have methods.</p>
<p>They can be copied, deleted, passed as arguments to other functions, returned by other functions.</p>
<p>They also provide scope.</p>
<p>And they have special feature that sets them apart from the other objects – they are invokable, they can be called.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/functions-are-objects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prototypal inheritance</title>
		<link>http://www.jspatterns.com/prototypal-inheritance/</link>
		<comments>http://www.jspatterns.com/prototypal-inheritance/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:49:09 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Code reuse patterns]]></category>

		<category><![CDATA[inheritance]]></category>

		<category><![CDATA[prototypal]]></category>

		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=60</guid>
		<description><![CDATA[Here's the prototypal inheritance pattern suggested by Douglas Crockford.
The implementation looks similar to a classical pattern but the idea is very different.
The idea is that there’s no constructors involved that lead you to think in terms of classes.
You have an object and you want to create another object that gets functionality from the existing object.
And, [...]]]></description>
			<content:encoded><![CDATA[<p>Here's the prototypal inheritance pattern suggested by Douglas Crockford.</p>
<p>The implementation looks similar to a <a href="http://www.jspatterns.com/classical-inheritance/">classical pattern</a> but the idea is very different.</p>
<p>The idea is that there’s no constructors involved that lead you to think in terms of classes.<br />
You have an object and you want to create another object that gets functionality from the existing object.</p>
<p>And, unlike when we simply copied properties over from the parent, here we involve the prototype and keep the prototype chain.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">object</span><span class="hl-brackets">(</span><span class="hl-identifier">o</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">
  </span><span class="hl-identifier">F</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-identifier">o</span><span class="hl-code">;
  </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>We take an existing object <code>o</code>, create a blank constructor function and set the parent object <code>o</code> to be the prototype.</p>
<p>Then return an object created with the temporary constructor. This child object has all properties of the parent as part of the prototype.</p>
<p>And here’s an example usage:</p>
<div class="hl-main">
<pre><span class="hl-code">&gt;&gt;&gt; </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">parent</span><span class="hl-code"> = </span><span class="hl-brackets">{</span><span class="hl-identifier">a</span><span class="hl-code">: </span><span class="hl-number">1</span><span class="hl-brackets">}</span><span class="hl-code">;
&gt;&gt;&gt; </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">child</span><span class="hl-code"> = </span><span class="hl-identifier">object</span><span class="hl-brackets">(</span><span class="hl-identifier">parent</span><span class="hl-brackets">)</span><span class="hl-code">;
&gt;&gt;&gt; </span><span class="hl-identifier">child</span><span class="hl-code">.</span><span class="hl-identifier">a</span><span class="hl-code">;
</span><span class="hl-number">1</span><span class="hl-code">
&gt;&gt;&gt; </span><span class="hl-identifier">child</span><span class="hl-code">.</span><span class="hl-identifier">hasOwnProperty</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-reserved">false</span></pre>
</div>
<p>The child object has everything the parent has - not as its own properties but as properties of its prototype.</p>
<h3>ECMAScript 5</h3>
<p>In the proposed version 5 of the ECMAScript standard, there will be a method that will work similarly and also accept another object, so basically you'll be able to inherit and add more functionality at the same time.</p>
<div class="hl-main">
<pre><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">child</span><span class="hl-code"> = </span><span class="hl-identifier">Object</span><span class="hl-code">.</span><span class="hl-identifier">create</span><span class="hl-brackets">(</span><span class="hl-identifier">parent</span><span class="hl-code">, </span><span class="hl-brackets">{</span><span class="hl-identifier">more</span><span class="hl-code">:</span><span class="hl-number">1</span><span class="hl-brackets">}</span><span class="hl-brackets">)</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/prototypal-inheritance/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Classical inheritance</title>
		<link>http://www.jspatterns.com/classical-inheritance/</link>
		<comments>http://www.jspatterns.com/classical-inheritance/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 17:40:51 +0000</pubDate>
		<dc:creator>stoyan</dc:creator>
		
		<category><![CDATA[Code reuse patterns]]></category>

		<category><![CDATA[classical]]></category>

		<category><![CDATA[inheritance]]></category>

		<guid isPermaLink="false">http://www.jspatterns.com/?p=59</guid>
		<description><![CDATA[Let's talk a bit about classical inheritance. The word "classical" is not used in the sense of old-school middle-age has-been-around forever kind of meaning.
Classical just means that you think in terms of classes. Your objects are created by constructor functions and you want objects created from one constructor Child() to get properties that come from [...]]]></description>
			<content:encoded><![CDATA[<p>Let's talk a bit about classical inheritance. The word "classical" is not used in the sense of old-school middle-age has-been-around forever kind of meaning.</p>
<p>Classical just means that you think in terms of classes. Your objects are created by constructor functions and you want objects created from one constructor <code>Child()</code> to get properties that come from another constructor <code>Parent()</code>.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">Parent</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">name</span><span class="hl-code"> = </span><span class="hl-quotes">'</span><span class="hl-string">Adam</span><span class="hl-quotes">'</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-identifier">Parent</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">.</span><span class="hl-identifier">say</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-reserved">this</span><span class="hl-code">.</span><span class="hl-identifier">name</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">;

</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">Child</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-brackets">}</span></pre>
</div>
<p>So we call a function called <code>inherit()</code> and let’s see some patterns for implementing this function. </p>
<div class="hl-main">
<pre><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">Child</span><span class="hl-code">, </span><span class="hl-identifier">Parent</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<h3>Option #1 - The ECMA way</h3>
<p>Here's the ECMA standard way. You create an object using the <code>Parent()</code> and assign this object to the <code>Child()</code>'s prototype.<br />
Than when you do <code>new Child()</code>, it will get functionality from the <code>Parent()</code> instance via the prototype.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">C</span><span class="hl-code">, </span><span class="hl-identifier">P</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">P</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>This pattern has the drawback that it’s tough to pass arguments to the parent during the call to <code>new Child()</code></p>
<h3>Option #2 - Rent-a-constructor</h3>
<p>This next pattern solves the problem of passing arguments. It <a href="http://www.jspatterns.com/borrowing-methods-pattern/">borrows</a> the parent constructor passing the child object to be bound to this and passing any arguments.</p>
<p>This way you can only inherit properties added to <code>this</code> inside the parent constructor.<br />
You don't inherits stuff that was added to the prototype.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">C</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">c</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-code">, </span><span class="hl-identifier">d</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">call</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-code">, </span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<h3>Option #3 - rent + prototype</h3>
<p>Combining the previous two patterns you can pass arguments by borrowing the constructor and also inherit from the prototype.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">C</span><span class="hl-brackets">(</span><span class="hl-identifier">a</span><span class="hl-code">, </span><span class="hl-identifier">c</span><span class="hl-code">, </span><span class="hl-identifier">b</span><span class="hl-code">, </span><span class="hl-identifier">d</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">call</span><span class="hl-brackets">(</span><span class="hl-reserved">this</span><span class="hl-code">, </span><span class="hl-identifier">arguments</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span><span class="hl-code">
</span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">P</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;</span></pre>
</div>
<p>Drawback is that the parent constructor is called twice.</p>
<h3>Option #3</h3>
<p>Here's another way to do classical inheritance that doesn't include calling the parent constructor at all.</p>
<p>The <a href="http://www.jspatterns.com/prototype/">rule of thumb</a> is that reusable stuff should go to the prototype.</p>
<p>So for inheritance purposes, anything interesting should be in the prototype. Can you just say that child’s is the parent’s prototype? Yes, you can.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">C</span><span class="hl-code">, </span><span class="hl-identifier">P</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>This gives you really short prototype chain lookups because everybody has the same prototype. But that’s also a drawback because if a child down the inheritance chain modifies the prototype, it affects all parents.</p>
<h3>Option #5</h3>
<p>This next pattern solves the same-prototype problem by breaking the direct link and benefiting from the prototype chain.</p>
<p>Here you have an empty function which gets the prototype of the parent. The prototype of the child is an instance of the blank function.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">C</span><span class="hl-code">, </span><span class="hl-identifier">P</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">;
  </span><span class="hl-identifier">F</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>This pattern has a behavior slightly different from the ECMA standard suggestion because here you only inherit properties of the prototype. And that’s fine, actually preferable. Like I said – the prototype is the place for reusable functionality. Anything the parent ads to <code>this</code> inside the constructor is ignored. </p>
<h3>Option #5 + super</h3>
<p>Building on top of the previous pattern, you can add a reference to the original parent. This is like having access to the superclass in other languages.</p>
<p>The property is called <code>uber</code> because <code>super</code> is a reserved word and <code>superclass</code> may lead the non-suspecting developer down the path of thinking that JavaScript has classes. And we don’t want that, right?</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">C</span><span class="hl-code">, </span><span class="hl-identifier">P</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">;
  </span><span class="hl-identifier">F</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">uber</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<h3>Option #5 + super + constructor reset</h3>
<p>One last thing to do in this almost perfect classical inheritance function is to reset the pointer to the constructor function in case we need it down the road.</p>
<div class="hl-main">
<pre><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">inherit</span><span class="hl-brackets">(</span><span class="hl-identifier">C</span><span class="hl-code">, </span><span class="hl-identifier">P</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
  </span><span class="hl-reserved">var</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-code"> = </span><span class="hl-reserved">function</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-brackets">{</span><span class="hl-brackets">}</span><span class="hl-code">;
  </span><span class="hl-identifier">F</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">F</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">uber</span><span class="hl-code"> = </span><span class="hl-identifier">P</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">;
  </span><span class="hl-identifier">C</span><span class="hl-code">.</span><span class="hl-identifier">prototype</span><span class="hl-code">.</span><span class="hl-identifier">constructor</span><span class="hl-code"> = </span><span class="hl-identifier">C</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre>
</div>
<p>If you don’t reset the constructor pointer, objects created with the <code>Child()</code> constructor will report that they were created with the <code>Parent()</code> constructor.</p>
<p>A function like this exists in the YUI library and helps you with your classical inheritance needs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jspatterns.com/classical-inheritance/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
