<?xml version="1.0" encoding="UTF-8"  standalone="yes" ?>
<rss version="2.0">
	<channel>
		<title>社群: Web Programming - 文件區(Design Pattern)</title>
		<description>台灣數位學習數位教學平台 RSS feed provider</description>
		<language>zh-tw</language>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doclist&amp;folderID=1600</link>
	<item>
		<title>疊代 iterator</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8655</link>
		<description>在 data collection 中，提供簡單的方法依序 (通常是 next) &amp;nbsp;取得元素var dataSet = (function() {&amp;nbsp; var index = 0,&amp;nbsp; &amp;nbsp; &amp;nbsp; data = [1, 2, 3, 4],&amp;nbsp; &amp;nbsp; &amp;nbsp; len = data.length;&amp;nbsp; return {&amp;nbsp; &amp;nbsp; next: function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; var el;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (!this.hasNext()) return null;&amp;nbsp; &amp;nbsp; &amp;nbsp; return data[index++];&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; hasNext: function() {&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; rewind: funciton() {&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; curr: function() {&amp;nbsp; &amp;nbsp; }&amp;nbsp; }})(); </description>
		<pubDate>Sat, 09 Jun 2012 19:54:52 +0800</pubDate>
	</item>
	<item>
		<title>模組範例</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8647</link>
		<description>利用以下特性，建立模組的範例 (p100 @ JavaScript Pattern)1. 命名空間 namespace2. 立即函式3. private (closure)4. 宣告相依性if (typeof FS.lib.array === &#039;undefined&#039;) {// 一般 lib 開發會很嚴謹，尤其是同一家公司，應該不會不小心被覆蓋，所以可以省略檢查FS.namespace(&#039;FS.lib.array&#039;);FS.lib.array = (function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; // 宣告相依性&amp;nbsp; var uobj = FS.lib.object,&amp;nbsp; &amp;nbsp; &amp;nbsp; ulang = FS.lib.lang,&amp;nbsp; &amp;nbsp; &amp;nbsp; // private 屬性&amp;nbsp; &amp;nbsp; &amp;nbsp; _str = &quot;...&quot;;&amp;nbsp; // init&amp;nbsp;&amp;nbsp;&amp;nbsp; // public API&amp;nbsp; return {&amp;nbsp; &amp;nbsp; inArray: function() { ... },&amp;nbsp; &amp;nbsp; isArray: funciton() { ... }}());}將 private 變成 public，物件完成後，決定開放那些 APIFS.lib.array = (function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; // 宣告相依性&amp;nbsp; var uobj = FS.lib.object,&amp;nbsp; &amp;nbsp; &amp;nbsp; ulang = FS.lib.lang,&amp;nbsp; &amp;nbsp; &amp;nbsp; // private 屬性&amp;nbsp; &amp;nbsp; &amp;nbsp; _str = &quot;...&quot;;&amp;nbsp; // init&amp;nbsp;&amp;nbsp;&amp;nbsp; // private method&amp;nbsp; inArray = function() { ... }&amp;nbsp; isArray = fucction() { ... }&amp;nbsp; // set public API&amp;nbsp; return {&amp;nbsp; &amp;nbsp; inArray: inArray,&amp;nbsp; &amp;nbsp; isArray: isArray}());     </description>
		<pubDate>Wed, 06 Jun 2012 21:39:57 +0800</pubDate>
	</item>
	<item>
		<title>鏈結模式 chain (return this, 就是 jQuery 的方式)</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8645</link>
		<description>var obj = {&amp;nbsp; &amp;nbsp; value: 1,&amp;nbsp; &amp;nbsp; inc: function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.value ++;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this;&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; add: function(v) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.value += v;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return this;&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; out: function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(this.value);&amp;nbsp; &amp;nbsp; }};obj.inc().add(3).out(); </description>
		<pubDate>Wed, 06 Jun 2012 17:06:10 +0800</pubDate>
	</item>
	<item>
		<title>建立命名空間的習慣</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8643</link>
		<description>全大寫&amp;nbsp;var MYAPP = {};建立前先檢查if (typeof MYAPP === &#039;undefined&#039; {&amp;nbsp; var MYAPP = {};}orvar MYAPP = MYAPP || {};建立前檢查，利用&amp;nbsp;namespace() 的輔助 (p92 @ JavaScript Pattern)MYAPP.namespace = function(ns) {&amp;nbsp; var parts = ns.split(&#039;.&#039;),&amp;nbsp; &amp;nbsp; &amp;nbsp; parent = MYAPP,&amp;nbsp; &amp;nbsp; &amp;nbsp; i;&amp;nbsp; if (parts[0] === &quot;MYAPP&quot;) {&amp;nbsp; &amp;nbsp; parts = parts.slice(1);&amp;nbsp; }&amp;nbsp; for (i=0; i&amp;lt;parts.length; i++) {&amp;nbsp; &amp;nbsp; if (typeof parent[parts[i]] === &#039;undefined&#039;) {&amp;nbsp; &amp;nbsp; &amp;nbsp; parent[parts[i]] = {};&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; parent = parent[parts[i]];&amp;nbsp; }&amp;nbsp; return parent;}var mod2 = MYAPP.namespace(&#039;MYAPP.modules.mod2&#039;);   </description>
		<pubDate>Wed, 06 Jun 2012 16:34:33 +0800</pubDate>
	</item>
	<item>
		<title>初始階段的分支 (避免執行時期每次都檢查)</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8642</link>
		<description>每次執行都檢查var utils = {&amp;nbsp; addListener: function(el, type, fn) {&amp;nbsp; &amp;nbsp; if (typeof window.addEventListener == &#039;function&#039;) {&amp;nbsp; &amp;nbsp; &amp;nbsp; el.addEventListerner(...);&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; else { ... }&amp;nbsp; },&amp;nbsp; removeListener: function() ...}依照檢查結果定義不同的函式，避免每次都檢查var utils = {&amp;nbsp; addListener: null,&amp;nbsp; removeListener: null}if (typeof&amp;nbsp;window.addEventListener == &#039;function&#039;) {&amp;nbsp; utils.addListener = function ...} </description>
		<pubDate>Wed, 06 Jun 2012 16:13:25 +0800</pubDate>
	</item>
	<item>
		<title>立即函式 (Immediate function)</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8641</link>
		<description>1. 將運算包裝起來，減少全域變數var o = {&amp;nbsp; msg: (function(){&amp;nbsp; &amp;nbsp; var who = &quot;me&quot;,&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; what = &quot;call&quot;;&amp;nbsp; &amp;nbsp; return what + &quot; &quot; + who;&amp;nbsp; }()),&amp;nbsp; getMsg: function() {&amp;nbsp; &amp;nbsp; return this.msg;&amp;nbsp; }}2. 沒有名字的需求，例如只執行一次的函式 init()(function() {&amp;nbsp; var days = [ ... ], &amp;nbsp;//&amp;nbsp;如果直接 var 就會產生 global 變數&amp;nbsp; &amp;nbsp; &amp;nbsp; today = new Date(),&amp;nbsp; &amp;nbsp; &amp;nbsp; msg = ...;&amp;nbsp; alert(msg);}() );3. 儲存 private 資料
 </description>
		<pubDate>Wed, 06 Jun 2012 16:05:35 +0800</pubDate>
	</item>
	<item>
		<title>自我重新定義函式 ~ 初始的技巧</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8640</link>
		<description>第一次沒有正式定義，之後就只做更少的事情 (lazy function definition)var func = function() {&amp;nbsp; alert(&quot;init ...&quot;);&amp;nbsp; func = function() {&amp;nbsp; &amp;nbsp; alert(&quot;real body ...&quot;);&amp;nbsp; }}func(); &amp;nbsp;// init ...func(); &amp;nbsp;// real body ... </description>
		<pubDate>Wed, 06 Jun 2012 15:53:48 +0800</pubDate>
	</item>
	<item>
		<title>回傳函式應用 (closure)</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8638</link>
		<description>var setup = function() {&amp;nbsp; var count = 0; &amp;nbsp;// closure, provide private used internal only&amp;nbsp; &amp;nbsp; return function() {&amp;nbsp; &amp;nbsp; &amp;nbsp; return count ++;&amp;nbsp; &amp;nbsp; }}var next = setup();next(); &amp;nbsp;// 1next(); &amp;nbsp;// 2   </description>
		<pubDate>Wed, 06 Jun 2012 15:42:37 +0800</pubDate>
	</item>
	<item>
		<title>Callback 應用範例 (保持泛用)</title>
		<link>http://lms.xms.com.tw/board.php?courseID=100&amp;f=doc&amp;cid=8637</link>
		<description>// just find nodesvar findNodes = function() {&amp;nbsp; var nodes=[], found;&amp;nbsp; while (true) {&amp;nbsp; &amp;nbsp; ...&amp;nbsp; &amp;nbsp; nodes.push(found);&amp;nbsp; }&amp;nbsp; return nodes;}// hide nodesvar hide = function(nodes) {&amp;nbsp; var i=0, max=nodes.length;&amp;nbsp; for ( ; i&amp;lt;max; i++) {&amp;nbsp; &amp;nbsp; nodes[i].style.display = &quot;none&quot;;&amp;nbsp; }}使用 callbackfindNodes 的同時做 hide 來增加效率，而且保持 findNodes 的泛用性 (less coupling)var findNodes = function(callback) {&amp;nbsp; var nodes=[], found;&amp;nbsp; if (typeof callback !== &quot;function&quot;) {&amp;nbsp; &amp;nbsp; callback = false;&amp;nbsp; }&amp;nbsp; while (true) {&amp;nbsp; &amp;nbsp; ...&amp;nbsp; &amp;nbsp; if (callback) {&amp;nbsp; &amp;nbsp; &amp;nbsp; callback(found);&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; nodes.push(found);&amp;nbsp; }&amp;nbsp; return nodes;}var hide = function(node) {&amp;nbsp; node.style.display = &quot;none&quot;;};findNodes(hide); &amp;nbsp;// findNodes(function(node) { node.style.display = &quot;none&quot;; });物件 method 的作用域 Callback &amp;amp; Scope如果 callback 是物件的方法，需要做調整 (p.67 @ JavaScript Patterns)var app = {&amp;nbsp; color: &quot;green&quot;,&amp;nbsp; paint: function(node) { node.style.color = this.color; }}findNodes(app.paint); &amp;nbsp;// error，因為 this 會指向全域變數，因為 findNodes 是 globalfindNodes(app.paint, app);var findNodes = function(callback, obj) {&amp;nbsp;&amp;nbsp;if (typeof callback === &#039;string&#039;) { &amp;nbsp;// findNodes(&#039;paint&#039;, app); 少打一個 app (app.paint)&amp;nbsp; &amp;nbsp; callback = obj[callback];&amp;nbsp; }&amp;nbsp; if (typeof callback === &#039;function&#039;) {&amp;nbsp; &amp;nbsp; callback.call(obj, found);&amp;nbsp; }};           </description>
		<pubDate>Wed, 06 Jun 2012 15:28:40 +0800</pubDate>
	</item>
	</channel>
	</rss>
