一.工厂模式
首先提出的是工厂模式,使用函数来封装一个创建对象的过程。
function createPerson(name,age,job){
let o={
name:name,
age:age,
job:job,
sayName:function(){
alert(this.name)
}
}
return o;
}
这种方法虽然解决了创建对象的问题,可由于被封装在函数里,始终有些不伦不类。
二.构造函数模式
使用js的this指针来完成自定义构造函数
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
}
}
这种方法很快也被发现了不足:总是重复定义相同的方法sayName(),该方法应为全部对象通用才对
三.构造函数模式改良
将函数移到外部
function sayName(){
alert(this.name);
}
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=sayName;
}
缺点也很明显,全局作用域
四.原型模式
利用prototype建立对象
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
}
Person.prototype.sayName=function(){
alert(this.name);
}
现在就能实现共享函数了,那么现在是另一个问题,私有变量怎么实现
五.模块模式
事实上,在js中没有真正意义上的私有变量,但是我们可以通过闭包技巧来实现它。
先来看看私有变量实现原理:将变量封入匿名函数,在匿名函数里返回对象,对象中包含闭包,利用闭包能取得外层变量的特性,取得匿名函数中的变量。
//将变量封入立即执行函数中
let moduleTest=(function(){
let name="张三";//这里是私有变量
return {
age:12,//这里是公有变量
//闭包调用“私有变量”
sayName:()=>{
alert(name);
}
}
})();
按这个原理将原先的person对象改写(好像不太合理,有待改良)
let moduleTest=(function(){
let name,age,job;
return {
Person:(_name,_age,_job)=>{
[name,age,job]=[_name,_age,_job]
},
sayName:()=>{
(name&&age&&job)|| alert(name);
}
}
});
未完待续