1.jquery的工厂构造函数
下面这个例子,简要概括了jq的工厂模式。同时也是js面向对象的一种实现,里面有构造函数,有公有函数与属性(prototype可以被实例化的对象访问到),有私有函数与属性(单独定义的函数与属性,只能在工厂中使用)。
/*
使用的是命名空间的方式,例子中的DireWolf可以当成jQuery
global:一般用的是window,如果window为undefined则使用当前的this
factory:工厂函数,在这个函数里做所有的初始化
*/
(function(global, factory){
return factory(global);
}(typeof window !== "undefined" ? window : this,function(){
//定义DireWolf类
var DireWolf=function(index){
//因为DireWolf.prototype.init.prototype被指定为DireWolf.prototype
//所以创建出来的实例,会继承DireWolf.prototype里的东西
return new DireWolf.prototype.init(index);
}
//定义DireWolf的原型,这里的东西会被实例化的对象直接访问到
DireWolf.prototype={
index:0, //狼的编号
say:function(){//说话
var w=getWolfName(this.index);
alert(w.belong+'的'+w.name);
},
init:function(index){
this.index=index;
//返回实例化后的对象
return this;
}
}
//定义DireWolf的私有方法,只有工厂里面才能访问到
//通过狼的编号获得狼的名字
function getWolfName(index){
return wolfs[index];
}
//定义DireWolf的私有方法,只有工厂里面才能访问到
//狼名与主人
var wolfs=[{name:'Grey Wind',belong:'罗柏·史塔克'},{name:'Lady',belong:'珊莎·史塔克'},{name:'Nymeria',belong:'艾莉亚·史塔克'},
{name:'Summer',belong:'布兰·史塔克'},{name:'Shaggydog',belong:'瑞肯·史塔克'},{name:'Ghost',belong:'琼恩·雪诺'}];
//特别注意:这里将DireWolf.prototype.init.prototype被指定为DireWolf.prototype。之后可以通过new DireWolf.prototype.init来实例化对象
DireWolf.prototype.init.prototype=DireWolf.prototype;
//将window的DireWolf定义为这里的命名空间DireWolf,可以像使用$一样使用DireWolf
window.DireWolf=DireWolf;
//如果是使用var DireWolf=(function(){}())来声明命名空间空间的话,这里返回即可
return DireWolf;
}));
DireWolf(1).say();//珊莎·史塔克的Lady
DireWolf(5).say();//琼恩·雪诺的Ghost