javascript 设计模式 (张容铭)之 学习篇

灵活的语言--javascript

第一天

小白接到了需求

function checkName(){
    // 验证姓名
}
function checkEmail(){
    // 验证邮箱
}

工作多年的小铭看到了小白提交的代码,说道:“你创建了很多全局变量啊”。 小白不解的问道:“我只是写了几个函数而已,哪里的变量啊”。 小铭反问道:“函数不是变量吗?”。 小白陷入了沉思中。

函数的另一种形式

小铭见状忙笑着说:“别着急,你看,如果我这么声明几个变量来实现你的功能你看可以吗?”

var checkName = function(){
    // 验证姓名
}
var checkEmail = function(){
    // 验证邮箱
}

小白:“一样的,只不过。。。”

小铭:“对,只不过这个在用的时候要提前声明,但是这么看你就会发现你创建了3个函数保存在变量里来实现你的功能,而你写的是将你的变量名放在 function 后面而已,它也代表了你的变量。所以说你也声明了3个全局变量。”

这有什么问题吗?

从功能上讲没啥问题,但是如果别人定义了相同的方法就会覆盖掉原有的功能了。如果你定义了很多的方法,这种相互覆盖的问题是很不容易察觉到的

那我该如何避免呢?

你可以将它们放在一个变量里保存,这样就可减少覆盖或者被覆盖的风险,当然一旦被覆盖,所有的功能都会失效,这种现象也是很明显的,你自然也会轻易察觉到

可是我如何做呢?

用对象收编变量

“对象你知道把,它有属性和方法,而如果我们要访问它的属性或者方法时,可通过点语法向下遍历查询得到。”

var CheckObject = {
    checkName : function(){
        // 验证姓名
    },
    checkEmail : function(){
        // 验证邮箱
    }
}

“此时我们将所有的函数作为 checkObject 对象的方法,比如检测姓名 CheckObject.checkName(),我们原来使用的函数式前面多了一个对象的名称”

“既然我们可以通过点语法来使用方法,我们是不是也可以这么创建呢?”

对象的另一种形式

“当然,不过你要声明一个对象,然后给它添加方法”

var CheckObject = function(){}
CheckOject.checkName = function(){
    // 验证姓名
}
CheckObject.checkEmail = function(){
    // 验证邮箱
}

“小铭说:现在虽然能满足你的需求,但当别人想用你的对象方法时就有些麻烦了,因为这个对象不能复制一份,或者说这个对象类在用 new 关键字创建新的对象时,新创建的对象是不能继承这些方法的”

“但是复制又有什么用呢?”

“如果说你有一本书,你的小伙伴也想得到,你该怎么办呢?如果你有个打印机,给他们一本打印一本是不是就可以了呢”

“我似乎明白了,但是我该如何去做呢?”

真假对象

小铭解释道:“如果你是简单的复制一下,你可以把这些方法放到一个函数对象中。”

var CheckObject = function(){
    return {
        checkName : function(){
            // 验证姓名
        },
        checkEmail : function(){
            // 验证邮箱
        }
    }
}

小白看了一下代码,思考到:你写的看上去是,每次调用这个函数的时候,把我们之前写的那个对象返回出来,当别人每次调用这个函数时都返回了一个新对象,这样执行过程中明面上是 CheckObject 对象,可实际上返回的是新对象。这样每个人在使用时就不会相互影响了

var a = CheckObject();
a.CheckEmail();

转载于:https://my.oschina.net/u/3520255/blog/3019980

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值