JS “eval智能” 工厂模式

<script>
var Shop = function () {
this.name = function () { document.write("商店的名字 <br/>"); },
this.local = function () { document.write("商店的位置 <br/>"); }
};

var ToolShop = function () {
ToolShop.convertASThis.constructor.call(this);
this.kind = function () { document.write("卖工具的商店 <br/>"); },
this.time = function () { document.write("工具商店营业时间8:00~16:00 <br/>"); }
};

var PetShop = function () {
PetShop.convertASThis.constructor.call(this);
this.kind = function () { document.write("卖猫狗的商店 <br/>"); },
this.time = function () { document.write("营业时间9:00~15:00 <br/>"); }
};

extend(ToolShop, Shop);
extend(PetShop, Shop);

//=========================================================

var Fish_ToolShop = function () {
Fish_ToolShop.convertASThis.constructor.call(this);
this.material = function () { document.write("钓鱼所用的材料! <br/>"); };
}

var Repair_ToolShop = function () {
Repair_ToolShop.convertASThis.constructor.call(this);
this.material = function () { document.write("修理所用的材料! <br/>"); };
}

extend(Repair_ToolShop, ToolShop);
extend(Fish_ToolShop, ToolShop);

//=========================================================

//智能工厂,动态实例化商店
var ShopFactory = {
Init: function (shopName) {
var tmpObj = eval("new " + shopName + "();");
return tmpObj;
}
};

//=========================================================

//不同的工具商店可能存在多种不同类型的工具,所以存在一个商店的父类但是不能被实例化,需要在子类中重写
var FatherToolShop = function () {
this.sellTool = function (kind) {
throw new Error(‘this is a abstract class‘);
};
};

//这个对象继承FatherToolShop后重写sellTool来来进行实例
var OtherToolShop = function () { };
extend(OtherToolShop, FatherToolShop);

//继承之后将原型链中的sellTool方法重写
OtherToolShop.prototype.sellTool = function (kind) {
var kind = kind;
var kinds = ["Repair_ToolShop", "Fish_ToolShop"];

for (var v in kinds) {
if (kinds[v] == kind) {
kind = ShopFactory.Init(kind);
kind.kind(); //工具商店
kind.time(); //营业时间	
break;
}
}
return kind;
};

//=========================================================

var test = new OtherToolShop();
test.sellTool("Repair_ToolShop").material();
test.sellTool("Fish_ToolShop").material();
</script>

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。