先举个简单的组装的例子
//纸 var paper = new Paper(); //处理下 enable_fire_destory(paper); //ok,可以燃烧了.. paper.fire(); //猪 var pig = new Pig(); enable_fire_destory(pig); //不管怎么着,也能着了 pig.fire();
这种组装方式用于给毫不相关的对象快速添加一些通用的方法, 用法得当将节省大量代码~
这里举个实际开发中的例子,下面的代码肯定是我们平时经常写的,用于防止一次ajax请求没有完毕就请求第二次
obj = { .... is_loading : false, load_sth : function(callback) { if ( this.is_loading ) return; this.is_loading = true; new Ajax({ url : 'xxx.php', onComplete : function() This.is_loading = false; }}); }); }, .... };
使用组装的方法改写
//组装函数 function enable_single_thread_ajax(obj) { extend(obj, { _is_ajax_ing : false, is_ajax_ing : function() { return this._is_ajax_ing; }, ajax : function(params) { if (this.is_ajax_ing()) return; var This = this; this._is_ajax_ing = true; var _tmp_func = function(){}; //为了保持ajax的参数不变,要做点小牺牲 if (params['onComplete']) { _tmp_func = params['onComplete']; } params['onComplete'] = function() { This._is_ajax_ing = false; _tmp_func.apply(this, arguments); }; return Ajax(params); } }); } //还是那个对象 obj = { load_sth : function() { //打完收工了~ this.ajax({ url : 'xxx.php' }); } }; //给对象扩充方法 enable_single_thread_ajax(obj);
还可以直接扩展原型,达到扩充类的目的~,以前写过一篇自定义事件的文章,也是用的这种方法 : 简单实现js里的自定义事件
今天特地翻开没怎么看的<javascript设计模式>,里面定义这种扩展方式为”掺元类”,感觉这么翻译不是特好理解…

那啥。。。图灵的书都很耐看呀。
2010年04月2日 @ 07:18
我发现一个神奇的事情在google 输入 “js 掺和类” 自动出现的词条里头前4个都是 《JavaScript设计模式》但是点进去搜索”掺和类”居然没有找到任何字段。。 谷歌居然智能到此???
而百度 搜不出任何东西。。
2010年04月2日 @ 07:33
哦,已经不用百度搜索好多年~~~
2010年04月2日 @ 08:29