生活中我们知道,女人需要生孩子是需要有男人的配合的,先要出生、成长、结婚、生子。我们这里就简单的假设,男人是女人生孩子时的依赖。而依赖的注入就好比定了个娃娃亲。我们来用代码,一步一步演示黄蓉和穆念慈生孩子的过程。
一、首先定义一个实体封装对象,封装了各个实体。
(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());