javascript functional class model
a couple months ago, i started using the functional class model for javascript. instead of using class sample()
to define a class, i use var sample function()
. i like the way it looks and i like the way it feels. of course this is nothing new. i've seen several examples like this in the past. i finally got into the habit of using this pattern after reading Crockford's JavaScript: The Good Parts. it's an excellent book.
it took me a bit of time to get used to the public/private member pattern, but now that i have it under my belt, i just start thinking this way right out of the gate. it also seems to be to be a much better pattern (in Javascript) for establishing inheritance, too. you can pass objects in; use the aggregation pattern and return the results. not as 'verbose' as the prototype
pattern, imho.
here's a little example that allows users to interact with a timer that fires off a private method within the class:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>funcitonal js model</title> </head> <body> <h1>functional js model</h1> <fieldset id="welcome"> <legend id="status"></legend> <input type="button" id="start" value="Start" /> <input type="button" id="stop" value="Stop" /> </fieldset> </body> <script type="text/javascript"> var sample = function(args,child) { // private vars args = args || {wait:10000,msg:'ping!'}; var wait = args.wait || 10000; var msg = args.msg || 'ping!'; var timer_ping = null; // private methods function init() { document.getElementById('start').onclick = start; document.getElementById('stop').onclick = stop; start(); ping(); } function start() { timer_ping = setInterval(ping,wait); document.getElementById('status').innerHTML = 'Running...'; } function stop() { clearInterval(timer_ping); document.getElementById('status').innerHTML = 'Stopped'; } function ping() { var dt = new Date(); alert(msg+'\n'+dt); } // call internal init init(); // public interface var that = {}; that.init = init; that.start = start; that.stop = stop; return that; }; var s = null; window.onload = function() { s = sample(); } </script> </html>