Ajax 板


LINE

最近写js的一些心得 希望跟各位大大分享、讨论 谢谢大家 好读版: http://blog.turn.tw/?p=428 ----------------------------------------- 最近在开发「按赞」功能,也就是类似对商品列表「按赞」 或是「加入我的最爱」之类的功能。 (本篇不讨论server side与database实作,仅讨论client side的JavaScript) 按赞的对象是衣服,於是我先开份js档: // clothing.js // 我知道直接写整串程式逻辑不好,一大团难以理解 // 那我用function把各小功能包起来好了! // 先替按钮加上click event,点了之後就送出ajax, // 把这个衣服加入我的最爱 function setupToLikeButton(){ // some codes $('.to_like').click(function(e){ // some codes }); } // 再来替已经按赞过的东西加上click event, // 点下去就送出ajax,从我的最爱移除 function setupLikedButton(){ // some codes $('.liked').click(function(e){ // some codes }); } // 大功告成,写个「初始化」功能 // 正式执行clothing.js这个伟大的模组 function registerLikeButtonEvent(){ setupToLikeButton(); setupLikedButton(); } 然後在所有需要「按赞」功能的页面,加入这些程式码: <script src="/assets/js/jquery.js"></script> <script src="/assets/js/clothing.js"></script> <script type="text/javascript"> $(document).ready(function(){ registerLikeButtonEvent(); }); </script> 写完之後,再看了一眼,一股凉意上心头,觉得这些程式码真的很可悲。 * 这只是把一串js code,用function随便包一包、把功能随便分开而已 * 在所有需要「按赞功能」的页面加上一行registerLikeButtonEvent(),感觉不是模组化( 一点也不物件导向),依然停留在procedural programming(这边执行一串code、再跳过去 执行那边一串code,有bug的时候光tracing code就累死人) * setupToLikeButton跟setupLikedButton可能会被误用。应该禁止在 registerLikeButtonEvent以外的地方执行(有点像private method) * 多了setupToLikeButton、setupLikedButton、registerLikeButtonEvent三个global function,感觉就是很不爽 我对这串code很不满意、觉得应该有更好的pattern。 立马上网买三本书 JavaScript 设计模式 JavaScript大全(第六版) JavaScript:优良部分 其中「JavaScript 设计模式」果然是开卷有益。 下面就是应用Module Pattern之後的写法。 // clothing.js // 先做出一个命名空间,让变数名称留在local var LikeButtonModule; LikeButtonModule = (function(){ // 提示使用者这个模组跟jQuery有相依性 if (!window.jQuery) { throw new Error("LikeButtonModule requires jQuery") } // this line declares the module dependency and // gives the global variable a local reference. // 这行可以增进效能 var $ = window.jQuery; var _setupToLikeButton = function(){ // some codes $('.to_like').click(function(e){ // some codes }); }// end _setupToLikeButton var _setupLikedButton = function(){ // some codes $('.liked').click(function(e){ // some codes }); }// end _setupLikedButton // the public API interface return { initialize: function(){ // initialization _setupToLikeButton(); _setupLikedButton(); } }; }()); 然後在所有需要「按赞」功能的页面,加入这些程式码: <script src="/assets/js/jquery.js"></script> <script src="/assets/js/clothing.js"></script> <script type="text/javascript"> $(document).ready(function(){ LikeButtonModule.initialize(); }); </script> 各位觉得,有没有比较模组化的感觉呢? Q&A Q1: 为什麽 setupToLikeButton函式前面多了底线? 只是命名惯例,提醒developer它有private性质。 Q2: 那setupToLikeButton为何会得到private性质? 因为它是function内的一个var,被限定在function的closure内, 所以function以外的地方不能执行它。 Q3: LikeButtonModule只有提供一个initialize函式给别人使用?这什麽烂模组? 等到「按赞系统」需要的功能更复杂、更丰富时, 可以在最後return的物件内定义模组公开API, 到时这个pattern会看起来很完整很漂亮。 Q4: 我看到一个很怪的文法 (function(){}()); 请问它是什麽? 那是JavaScript的立即函式。简单来说就是定义一个function然後马上执行它。 注意这个函式最後return一个物件, 而这个物件也就是这个模组的公开API介面。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.169.199.175
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Ajax/M.1399279298.A.769.html
1F:推 tomin:推 module pattern好像也有不同的写法 05/05 21:47
2F:推 pttnews:Q4 请看#1G04oTGX 05/06 09:56
3F:→ pttnews:你没爬文喔~ 你的上上篇就有啦~ 05/06 09:57
4F:推 s25g5d4:...那个 Q4 是内文 而且有解答 05/06 10:18
5F:→ dlikeayu:沙盒那个比较真的符合模组化 可以随插即用 05/08 04:34







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP