1:工厂模式
工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。
简单的工厂模式可以理解为解决多个相似的问题;这也是她的优点
function work(name,sex){
var obj=new Object();
obj.name=name;
obj.sex=sex;
obj.habby=function(){
return "追剧";
};
return obj;
}
var worker =work("fan","女");
console.log(worker);
console.log(worker.sex); //女
console.log(worker.habby()); //追剧
console.log(typeof worker);//object
优点:能解决多个相似的问题。
缺点:不能知道对象识别的问题(对象的类型不知道)。
注释:解决了创建多个对象的问题,但是没有结解决对象识别的问题(怎样知道一个对象的类型)
2:构造函数模式
function construct(){
this.name="谦谦";
this.sex="女";
this.eat=function(){
return this.name+"吃米饭";
}
}
var con=new construct ();
console.log(con);
console.log(con.eat());//谦谦吃米饭
console.log(typeof con); //object
注释:没有显示的创建对象,没有返回语句,直接将属性赋给this对象,将Person的实例对象标识为一种特定的类型
缺点:每个方法在每个实例上面都需要重新定义一遍
3:原型模式
function yuanx(){
}
yuanx.prototype.name="帆帆";
yuanx.prototype.eat=function() {
return this.name+"吃饭";
}
var yuan=new yuanx();
console.log(yuan.name);//帆帆
console.log(yuan.eat()); //帆帆吃饭
注意:省略了为构造函数传递初始化参数,结果所有实例享有相同的属性(对于函数实用,但是对于那些基本属性也说的过去,但是对于引用类型的数据就麻烦了)
基本属性我们可以在实例当中添加一个同名属性,这样可以隐藏原型当中的对应的属性,但是引用类型的属性却会导致所有实例共享
4:组合使用构造函数与原型模式
构造函数用于定义实例属性,原型上面定义共享的属性和方法
function ff(){
this.name="汉中";
this.special="面皮";
}
ff.prototype.view =function(){
return this.name+"油菜花";
}
var f2=new ff();
console.log(f2.view()); //汉中油菜花
5:动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.speak != "function"){
Person.speak = function(){
console.log(this.name);
};
}
}
**
6:单例模式
var alone=(function(){
var newone;
function getone(){
if(newone==undefined){
newone=new factory();
}
return newone ;
}
function factory(){
this.name="lifa";
this.sex="女";
this.watch=function(){
return "看电视"
}
}
return{
getone:getone
}
})()
console.log(alone.getone ().sex); //女
console.log(alone.getone ().watch()); //看电视
单例模式也称作为单子模式,单体模式。单例模式的定义是产生一个类的唯一实例,是软件设计中较为简单但是很常用的一种设计模式。
单例模式的核心是确保只有一个实例,并提供全局访问
单体模式的优点是:
可以用来划分命名空间,减少全局变量的数量。
使用单体模式可以使代码组织的更为一致,使代码容易阅读和维护。
可以被实例化,且实例化一次。
理解使用代理实现单列模式的好处:
比如我现在页面上需要创建一个div的元素,那么我们肯定需要有一个创建 div的函数,而现在我只需要这个函数只负责创建div元素,其他的它不想管,也就是想实现单一职责原则,就好比淘宝的kissy 一样,一开始的时候他们定义kissy只做一件事,并且把这件事做好,具体的单体模式中的实例化类的事情交给代理函数去处理,这样做的好处是具体的业务逻辑分开了,代理只管代理的业务逻辑,在这里代理的作用是实例化对象,并且只实例化一次; 创建div代码只管创建div,其他的不管;