javascript设计模式 封装和信息隐藏(上)


在JavaScript中,封装(Encapsulation)和信息隐藏是面向对象编程(OOP)中的核心概念,它们帮助我们将数据和操作数据的函数组合成一个独立的单元(即对象),并限制对这些数据和函数的外部访问。这种做法有助于提高代码的可维护性、可重用性和安全性。

### 封装

封装指的是将数据(属性)和操作这些数据的方法(函数)结合在一个对象内部,并通过对象对外提供的接口(通常是公共方法)来访问这些数据和执行这些方法。在JavaScript中,我们可以通过构造函数、原型链、ES6的类(class)等方式来实现封装。

#### 示例:使用ES6类实现封装


class Person {
    constructor(name, age) {
        // 私有属性(在ES6中,私有属性需要使用#前缀,但这里为了说明,我们使用闭包来模拟)
        let _name = name;
        let _age = age;

        // 公有方法,可以访问和修改私有属性
        this.getName = function() {
            return _name;
        };

        this.setName = function(newName) {
            _name = newName;
        };

        this.getAge = function() {
            return _age;
        };

        // 假设我们不想直接设置年龄,因此不提供setAge方法
    }
}

// 使用Person类
let person = new Person('Alice', 30);
console.log(person.getName()); // Alice
person.setName('Bob');
console.log(person.getName()); // Bob
// 注意:由于我们没有提供setAge方法,因此不能直接修改年龄

### 信息隐藏

信息隐藏是封装的一个方面,它指的是将对象的内部实现细节(如数据结构和算法)隐藏起来,只向外界提供必要的接口。在JavaScript中,这通常通过私有属性和方法来实现,但JavaScript本身并没有直接的私有属性或方法的语法(直到ES2020的私有类字段)。然而,我们可以通过闭包、Symbol或弱映射(WeakMap)等技术来模拟私有属性。

#### 示例:使用闭包模拟私有属性

在上面的`Person`类示例中,我们使用了闭包来模拟私有属性`_name`和`_age`。这些属性在`constructor`函数内部定义,并且只能通过`Person`实例的方法访问,从而实现了信息隐藏。

### 总结

封装和信息隐藏是JavaScript中面向对象编程的重要概念,它们通过限制对对象内部数据的直接访问来提高代码的安全性和可维护性。在JavaScript中,我们可以通过构造函数、原型链、ES6类以及闭包等技术来实现封装和信息隐藏。