关键词

Javascript之面向对象–封装

Javascript之面向对象--封装

什么是封装

封装(Encapsulation)是面向对象编程的三大特性之一,它指的是将程序中的数据和方法包装在一起,形成一个类(Class),并且对外部隐藏这些实现的细节,只把公共的接口(接口就是能够被外部访问到的数据和方法)暴露出来,外部无法直接访问类内部的变量或函数。

封装能够提供以下优点:

  • 隐藏实现细节,保证数据的安全性;
  • 提高代码的可维护性,方便修改和拓展;
  • 简化编程,降低出错率。

Javascript中如何实现封装

在Javascript中,我们可以通过创建对象(Object)和类(Class)来实现封装。在对象的实现中,可以通过闭包(Closure)实现私有属性和方法的封装。在类的实现中,则可以通过ES6中的Class关键字来实现。

通过闭包实现封装

在Javascript中,闭包能够创建私有变量,而这些变量对于外部是不可见的,因此能够实现封装。一般情况下,我们用闭包来创建一个对象(Object),对象的属性和方法都在闭包里定义。

下面是一个例子:

function createPerson(name) {
  let age = 0; // 私有属性
  function getAge() { // 私有方法
    return age;
  }
  function setAge(newAge) { // 私有方法
    if (newAge >= 0 && newAge <= 120) {
      age = newAge;
    } else {
      throw new Error('年龄超出范围');
    }
  }
  return {
    getName() {
      return name;
    },
    getAge,
    setAge
  };
}

let person = createPerson('张三');
console.log(person.getName()); // 输出:张三
console.log(person.getAge()); // 输出:0
person.setAge(18);
console.log(person.getAge()); // 输出:18

在这个例子中,我们通过createPerson函数创建了一个包含私有属性和方法的对象。对象的外部只能通过公共接口getName、getAge和setAge来获取和修改数据,而不能直接访问age变量和getAge、setAge方法。

通过ES6的Class实现封装

在ES6中,我们可以使用Class关键字来声明一个类,类中包含了构造函数、属性和方法。

下面是一个例子:

class Person {
  #age = 0; // 私有属性
  // 构造函数
  constructor(name) {
    this.name = name; // 共有属性
  }
  // 公有方法
  getName() {
    return this.name;
  }
  // 私有方法
  #checkAge(newAge) {
    if (newAge >= 0 && newAge <= 120) {
      this.#age = newAge;
    } else {
      throw new Error('年龄超出范围');
    }
  }
  // 公有方法
  getAge() {
    return this.#age;
  }
  // 公有方法
  setAge(newAge) {
    this.#checkAge(newAge);
  }
}

let person = new Person('张三');
console.log(person.getName()); // 输出:张三
console.log(person.getAge()); // 输出:0
person.setAge(18);
console.log(person.getAge()); // 输出:18

在这个例子中,我们通过Class声明了一个Person类,类中包含了共有属性、私有属性、共有方法和私有方法,并且使用了ES6中的#符号来声明私有属性和方法。类的外部只能通过公共接口getName、getAge和setAge来获取和修改数据,而不能直接访问age变量和#checkAge方法。

总结

通过上面的例子,我们可以看到,通过封装,可以实现对数据和方法的保护,使程序更加安全和可维护。在Javascript中,我们可以通过闭包和Class来实现封装,它们都有各自的适用场景,需要根据实际情况选择使用。

本文链接:http://task.lmcjl.com/news/10418.html

展开阅读全文