javascript创建对象设计模式

一.工厂模式

首先提出的是工厂模式,使用函数来封装一个创建对象的过程。

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);
        }
    }   
});

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值