一般我们定义module的方式使用字面量的方式,一个方法一个方法的编写。这种方式直观且便于理解。今天看到一种可以无线扩展的module写法,很有意思,拿来共享,代码:

var myModule = (function manger(){
	var modules = {};
	function define(name, deps, impl){
		for(var i = 0; i < deps.length; i++){
			deps[i] = modules[deps[i]];
		}
		modules[name] = impl.apply(deps, impl);
	}
	function get(name){
		return modules[name];
	}
	return {
		define : define,
		get : get
	}
})();

原型提供define和get两个方法,通过define定义扩展,get获取基于modules的属性,由于必包。所以modules会被持续持有,所有会一直可扩展。再来分析下define方法,三个参数,name作为module属性,deps作为扩展中方法的属性,imple是属性具体的值,也就是具体(代码)方法。get就是让modules的方式暴露,被封装以外调用。来看下具体怎样扩展。

myModule.define('bar', [], function(){
	function hello(who){
		return 'hello ' + who + '!';
	}
	return {
		hello : hello
	}
});
myModule.define('foo', ['bar'], function(){
	function aweSome(){
		return bar.hello('lili').toUpperCase();
	}
	return {
		aweSome : aweSome
	}
});

var bar = myModule.get('bar');
var foo = myModule.get('foo');

console.log(bar.hello('lala'));
console.log(foo.aweSome());

示例中,先扩展一个bar方法,然后将hello方法暴露,最终形成module[bar[hello]] 的方法层级。第二个扩展foo,不仅扩展了方法,通过deps 参数还调用了module中已有的bar方法!最后通过get调用modules属性中的具体方法。哈!很佩服!

不禁感慨,自己也写代码,为何没有别人的高度。作为码农大军中的一员,大部分人在编写维护业务代码,对于语言本身的造诣还是和国外的码农有差距。站在客观角度,思考语言本身带来的实际价值又不可见,至少要看领导和公司是否认可。个人而言,还是觉得价值体现。才能带来实际职位和收入的提升。人格分裂中……