js类似spring ioc的依赖注入实现

原创
2018/08/27 16:40
阅读数 95

       生活中我们知道,女人需要生孩子是需要有男人的配合的,先要出生、成长、结婚、生子。我们这里就简单的假设,男人是女人生孩子时的依赖。而依赖的注入就好比定了个娃娃亲。我们来用代码,一步一步演示黄蓉和穆念慈生孩子的过程。

一、首先定义一个实体封装对象,封装了各个实体。

(function(window){
	//人抽象类
	function Preson(name,sex,age){
		this.name=name;
		this.sex=sex;
		this.age=age;
	}
	
	//生孩子
	Preson.prototype.createPreson=function(){
		console.log("创造了一个孩子:姓名:"+this.name+",性别:"+this.sex+",年龄:"+this.age);
	}
	
	
	//男人
	function Man(){
		Preson.apply(this,arguments);
		this.qizi;
	}
	Man.prototype=new Preson();
	Man.prototype.createPreson = function(){
		console.log("男人不可以生孩子");
	}
	//设置自己的妻子
	Man.prototype.setQizi = function(qizi){
		this.qizi=qizi;
	}
	
	//女人
	function Women(){
		Preson.apply(this,arguments);
		this.zhanfu;
	}
	Women.prototype=new Preson();
	//未使用依赖注入方法
	Women.prototype.createPreson = function(man){
		if(man instanceof Man){//判断是不是男人
			if(man===this.zhanfu && man.qizi===this){
				//随机生孩子
				var name=man.name.substring(0,1)+"xx";
				if(Math.floor(Math.random()*2)==0){
					//生女孩
					return new Women(name,"女",0);
				}else{
					//生男孩
					return new Man(name,"男",0);
				}
			}else{
				return "不是自己的丈夫不能生";
			}
		}else{
			return "女人生孩子需要依赖以男人";
		}
	}
	//开勇依赖注入的方式创建人
	Women.prototype.createPreson2 = function(){
		//获得当前调用对象需要的bean
		var man=this.getBean(this.name);
		//把当前调用对象的丈夫设为获得的bean
		this.setZhanfu(man);
		//把当前依赖对象的妻子设为当前调用对象
		man.setQizi(this);
		//开始创建人
		return this.createPreson(man);
	}
	
	//从依赖池中获取依赖
	Women.prototype.getBean = function(key){
		var beans=Entity.dependencies;
		for(var b in beans){
			if(b===key){
				return beans[b];
			}
		}
		return null;
	}
	
	//为女人扩展一个方法,设置自己的丈夫,结婚时调用
	Women.prototype.setZhanfu = function(man){
		this.zhanfu=man;
	}
	
	window.Entity={
		Preson:Preson,
		newPreson:function(name,sex,age){
			return new Preson(name,sex,age);
		},
		newMan:function(name,sex,age){
			return new Man(name,sex,age);
		},
		newWomen:function(name,sex,age){
			return new Women(name,sex,age);
		},
		register:function(key,obj){//根据实际需要注入需要的对象
			this.dependencies[key] = obj;
		},
		dependencies:{}//存储被依赖的模块
	};
})(window);

二、我们来看看,我们普通代码的书写过程。


		//郭靖出场了
		var guojin=Entity.newMan("郭靖","男",25);
		console.log(guojin.name+"出场了");
		
		//黄蓉出场了
		var huangrong=Entity.newWomen("黄蓉","女",24);
		console.log(huangrong.name+"出场了");
		
		//郭靖和黄蓉结婚了
		console.log(guojin.name+"和"+huangrong.name+"结婚了");
		huangrong.setZhanfu(guojin);
		guojin.setQizi(huangrong);
		
		//黄蓉为郭靖生孩子了
		var hz=huangrong.createPreson(guojin);
		console.log("黄蓉为郭靖生孩子了:"+JSON.stringify(hz));
		
		//杨康出场了
		var yangkang=Entity.newMan("杨康","男",25);
		console.log(yangkang.name+"出场了");
		
		//黄蓉不为杨康生孩子
		var yhz=huangrong.createPreson(yangkang);
		console.log("黄蓉不为杨康生孩子:"+JSON.stringify(yhz));
		
		//穆念慈出场了
		var mnc=Entity.newWomen("穆念慈","女",24);
		console.log(mnc.name+"出场了");
		
		//杨康和穆念慈结婚了
		console.log(yangkang.name+"和"+mnc.name+"结婚了");
		mnc.setZhanfu(yangkang);
		yangkang.setQizi(mnc);
		
		//穆念慈为杨康生孩子
		var yhz=mnc.createPreson(yangkang);
		console.log("穆念慈为杨康生孩子:"+JSON.stringify(yhz));

三、我们再来看看,我们模拟spring ioc的依赖注入调用实现

        //注入黄蓉和穆念慈生孩子需要的对象,这里没有采用延时加载
		Entity.register("黄蓉",Entity.newMan("郭靖","男",25));
		Entity.register("穆念慈",Entity.newMan("杨康","男",25));
		
		//黄蓉生孩子
		var huangrong=Entity.newWomen("黄蓉","女",24);
		console.log(huangrong.createPreson2());
		
		//穆念慈生孩子
		var huangrong=Entity.newWomen("穆念慈","女",24);
		console.log(huangrong.createPreson2());

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部