JavaScript设计模式(1)-灵活的JS写法

一,开篇

JavaScript是一种非常灵活的语言,在js的世界里,函数是"一等公民"
近几年前端迅速崛起,各种js框架相继诞生,同时js也逐步成为了"全栈"领域

为了了解JS设计模式,首先需要掌握JS的一些基础写法

二,JS的多种写法

需求是写关于用户名,密码,邮箱的验证方法

1,小白写法(不推荐)

function checkUserName(){}
function checkPassword(){}
function checkEmail(){}

等同:

var checkUserName = function(){}
var checkPassword = function(){}
var checkEmail = function(){}
之所以称之为小白写法,并不是因为这样写是最简单的,而是因为这样写是"错的"
这种写法污染了全局变量,在多人协作的团队开发的项目中存在被覆盖的风险

2,对象收编变量

var checkUserInfo = {
    checkUserName : function(){},
    checkPassword : function(){},
    checkEmail : function(){}
}

checkUserInfo.checkUserName();

等同:

var checkUserInfo = {};
checkUserInfo.checkUserName = function(){}
checkUserInfo.checkPassword = function(){}
checkUserInfo.checkEmail = function(){}

checkUserInfo.checkUserName();
相比于小白写法,这种写法的好处是将属性或方法收编到一个对象中,
相当于为方法添加了自己的一个作用域
首先并没有污染全局,其次也极大程度的避免了被覆盖的风险

3,函数返回对象

var CheckUserInfo = function(){
    return {
        checkUserName : function(){},
        checkPassword : function(){},
        checkEmail : function(){}
    }
}
var checkUserInfo = CheckUserInfo();
checkUserInfo.checkUserName();
这种写法首先使用了对象收编函数的思想,将3个check函收编到了对象中
而获取这个对象时通过函数的返回来获取的
注意这里声明的函数变量名首字母是大写的CheckUserInfo,这里具有一个"类"的概念
每次调用function都会返回一个新对象,互不影响

4,类的写法

var CheckUserInfo = function(){
    this.checkUserName = function(){}
    this.checkPassword = function(){}
    this.checkEmail = function(){}
}

// 类的创建,调用方式
var checkUserInfo = new CheckUserInfo();
checkUserInfo.checkUserName();
使用了面向对象的方式,创建了一个用户信息校验的类,
使用前通过new关键字实例化这个类,新创建的对象会对类的this上的属性或方法进行复制,得到一个实例
这种写法的优势是,多个人通过new这个类,每个人都会得到一个单独的实例,互不影响
但作为一个通用的校验功能,每次new都创建一个新的实例,相当于浪费了内存

5,通过prototype原型添加属性(注意混用覆盖问题)

var CheckUserInfo = function(){};
CheckUserInfo.prototype.checkUserName = function(){}
CheckUserInfo.prototype.checkPassword = function(){}
CheckUserInfo.prototype.checkEmail = function(){}

var checkUserInfo = new CheckUserInfo();
checkUserInfo.checkUserName();

等同:

var CheckUserInfo = function(){};
CheckUserInfo.prototype = {
    checkUserName : function(){},
    checkPassword : function(){},
    checkEmail : function(){}
}

var checkUserInfo = new CheckUserInfo();
checkUserInfo.checkUserName();
通过prototype原型将属性或方法绑定到CheckUserInfo对象类的原型上
通过new创建实例时,创建的对象所拥有的方法都是一样的,以为需要依赖prototype原型依次查找
上边的第二种写法比第一种写法的优势在于不需要向第一种那样写很多次prototype
要注意的问题是两种写法不能混用,第二种为prototype原型赋值新的对象,会覆盖掉之前的prototype

6,链式写法
6.1对象收编属性或方法的链式写法:

var checkUserInfo = {
    checkUserName : function(){
        return this;
    },
    checkPassword : function(){
        return this;
    },
    checkEmail : function(){
        return this;
    }
}

checkUserInfo.checkUserName().checkPassword().checkEmail();

6.2类prototype原型对象的链式写法

var CheckUserInfo = function(){};
CheckUserInfo.prototype = {
    checkUserName : function(){
        return this;
    },
    checkPassword : function(){
        return this;
    },
    checkEmail : function(){
        return this;
    }
}

var checkUserInfo = new CheckUserInfo();
checkUserInfo.checkUserName().checkPassword().checkEmail()
通过对象收编属性或方法和类prototype原型对象的链式写法可以看到
每个function都返回了当前对象,所以才能实现链式调用
链式调用的优点很明显,可以在一句代码中连续调用多个方法进行校验

7,扩展原生Function对象方式(不推荐)

Function.prototype.checkUserName = function(){}

var func = function(){};
func.checkUserName();

var func1 = new Function(){};
func1.checkUserName();
这种写法拓展了JS原生的Function对象,将属性或方法添加到了Function对象的prototype原型对象中,
从而让所有的function都实现这个函数
但同时这种写法也污染JS原生Function对象,别人创建的函数也被污染了,而且还造成了不必要的开销

8,拓展原生Function对象-新增添加方法功能

// 拓展Function新增添加方法功能
Function.prototype.addMethod = function(name, fn){
    this[name] = fn;
}

// 创建function
var funcMothods = function(){};//或 var funcMothods = new Function();

// 添加方法
funcMothods.addMethod('checkUserName',function(){
    // checkUserName
})

// 调用方法
funcMothods.checkUserName();
这种拓展原生Function对象的方式,抽象了一个向function添加函数的方法,实现了对Function的拓展
当声明(或new)一个function时,function具有添加函数的功能
将需要的函数添加到当前function中,并使用

这种方式的好处是并没有污染原生Function(这种"污染"可以忽略),只是拓展了Function
通过addMethod添加的函数只对当前function生效,避免了不必要的开销

返回this,可以链式添加和链式调用

// 拓展Function新增添加方法功能
Function.prototype.addMethod = function(name, fn){
    this[name] = fn;
    return this;
}

// 创建function
var funcMothods = function(){};//或 var funcMothods = new Function();

// 链式添加方法
funcMothods.addMethod('checkUserName',function(){
    return this;
}).addMethod('checkPassword',function(){
    return this;
})

// 链式调用方法
funcMothods.checkUserName().checkPassword();

也可以用类的形式实现

// 拓展Function新增添加方法功能
Function.prototype.addMethod = function(name, fn){
    this[name] = fn;
    return this;
}

// 创建Mothods类
var Mothods = function(){};
// 添加方法(链式)
Mothods.addMethod('checkUserName',function(){
    // checkUserName
}).addMethod('checkPassword',function(){
    // checkPassword
});
// 类式使用
var methods = new Mothods();
methods.checkUserName();
首先拓展了原生Function对象,新增添加函数功能
创建function作为一个类,并向其添加两个方法(这里是链式添加)
使用new关键字创建对象实例,调用方法

三,结尾

简单的一个校验方法可以有如此多的实现方式,可以看出JS是相当灵活的一门语言
在JS的世界里,函数是"一等公民"

为了给JS设计模式打好基础,还要再看一下JS面向对象的编程方式 
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript 设计模式是在 JavaScript 编程中经常使用的一种代码组织和架构方法。设计模式可以帮助开发者解决常见的问题,并提供可复用的解决方案。 以下是一些常见的 JavaScript 设计模式: 1. 工厂模式(Factory Pattern):通过使用工厂方法创建对象,将对象的创建和使用分离开来,提高代码的可扩展性和可维护性。 2. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 3. 观察者模式(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会被自动通知并更新。 4. 发布-订阅模式(Publish-Subscribe Pattern):也是一种观察者模式的变体,在这种模式中,发布者(Publisher)和订阅者(Subscriber)之间通过消息队列进行通信。 5. 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,避免了使用类进行实例化的复杂性。 6. 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。 7. 装饰者模式(Decorator Pattern):动态地给对象添加新的功能,而不影响其他对象。 8. 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并使它们可以互换使用。 这些设计模式可以帮助开发者在编写 JavaScript 代码时更好地组织和设计代码结构,提高代码的可读性、可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BraveWangDev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值