045|使用闭包来加强封装

面向对象编程的一个概念是封装。封装的涵义是,只给你需要的(接口),隐藏你不需要的(实现细节)。

在过去的课程里,我们知道,给你一个object,我们能够获取该对象的任何属性。例如:

var student = {
    year:2017,
    month:5,
    day:24,
    getDate:function(){
        return this.year+"."+this.month+"."+this.day
    }
}

console.log(student.getDate())

上例中,我们可以任意地访问、修改student对象的所有属性。
但实际上,根据面向对象编程原则,对外部使用者来说,只有getDate函数是有用的。而像year、month、day属性是属性内部实现细节,不应该暴露给外部。

我们可以使用闭包来达到对外隐藏year、month、day属性的目的。我们看一下下面代码是如何做的:

function Student()
{
    var year = 2017
    var month = 5
    var day = 24
    return {
        getDate:function()
        {
            return year+"."+month+"."+day
        } // 闭包
    } // 返回一个新对象
}

var stuObj = new Student() // 改为Student()也是可以,性能会更好
console.log(stuObj.getDate())
console.log(stuObj.year)
console.log(stuObj.month)
console.log(stuObj.day)

上述代码中,Student()函数返回一个新建的对象,这个对象只有一个方法:getDate,所以stuObj中无法引用到year、month、day,因为不存在。
而实际上getDate指向的是一个闭包,这个闭包保存了Student()函数中的year、month、day的引用。保证了getDate()能够正确输出。

让我们看一下运行结果:

045|使用闭包来加强封装_第1张图片
运行结果

上述创建stuObj的地方,不使用new语句而仅调用Student()函数也是可以的,结果是一样的。实际上直接调用Student()性能会更好,因为每次调用可以少生成一个实例。

好了,这一节就到这里。思维上有那么一点点绕,希望你都掌握了。

什么是索引容器?
什么是call&apply?

请继续关注我的课程,我将在后续课程中帮大家依次解答上述问题。

想学计算机技术吗?需要1对1专业级导师指导吗?想要团队陪你一起进步吗?欢迎加我为好友!

我的微信

你可能感兴趣的:(045|使用闭包来加强封装)