先举个简单的组装的例子

//纸
var paper = new Paper();
//处理下
enable_fire_destory(paper);
//ok,可以燃烧了..
paper.fire();
//猪
var pig = new Pig();
enable_fire_destory(pig);
//不管怎么着,也能着了
pig.fire();
Copy Code 

这种组装方式用于给毫不相关的对象快速添加一些通用的方法, 用法得当将节省大量代码~

这里举个实际开发中的例子,下面的代码肯定是我们平时经常写的,用于防止一次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;
        }});
    });
},
....
};
Copy Code 

使用组装的方法改写

//组装函数
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);
Copy Code 

还可以直接扩展原型,达到扩充类的目的~,以前写过一篇自定义事件的文章,也是用的这种方法 : 简单实现js里的自定义事件

今天特地翻开没怎么看的<javascript设计模式>,里面定义这种扩展方式为”掺元类”,感觉这么翻译不是特好理解…