javascript 面向对象编程基础:封装

面向对象编程 (Object-Oriented Programming,OOP) 是一种编程范式,它将数据和操作数据的方法封装起来,以对象的形式呈现出来,以此来实现代码重用。其中,封装就是OOP中的三大特性之一。

封装(Encapsulation),顾名思义就是封住某些操作,不让外界直接访问内部的数据,只允许一些公共的接口对数据进行访问和操作,从而达到保护数据的目的。常见的封装方式就是利用构造函数、ES5 中的 Object.defineProperty、ES6 中的 class 等方式定义类,并利用各种访问修饰符(public、private、protected 等)来控制成员的访问权限。

在 JavaScript 中,对象通过在构造函数中定义属性和方法,可以轻松地实现封装。下面是一个简单的封装示例:

function Person(name, age) {
  this.name = name;
  var _age = age;

  this.sayHi = function() {
    console.log(`Hi, my name is ${this.name}, I'm ${_age} years old.`);
  };

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

  this.setAge = function(age) {
    if (age >= 0 && age <= 120) {
      _age = age;
    } else {
      console.log('Invalid age value.');
    }
  };
}

var Jack = new Person('Jack', 25);

console.log(Jack.name); // Jack
Jack.sayHi(); // Hi, my name is Jack, I'm 25 years old.
console.log(Jack.getAge()); // 25
Jack.setAge(30);
console.log(Jack.getAge()); // 30
Jack.setAge(-10); // Invalid age value.
console.log(Jack.getAge()); // 30

在上面的示例中,我们定义了一个 Person 的类,类中包含了一个公共的 name 属性,和一个私有的 _age 属性,以及公共的 sayHi 方法和 getAge/setAge 方法。其中,_age 属性被封装在类的构造函数内部,外部无法直接访问,只能通过类提供的公共接口(即 getAge 和 setAge 方法)来操作。

另一个示例是利用 ES6 中的 class 关键字来实现封装:

class Person {
  constructor(name, age) {
    this.name = name;
    var _age = age;

    this.sayHi = function() {
      console.log(`Hi, my name is ${this.name}, I'm ${_age} years old.`);
    };
  }

  get age() {
    return this._age;
  }

  set age(value) {
    if (value >= 0 && value <= 120) {
      this._age = value;
    } else {
      console.log('Invalid age value.');
    }
  }
}

var Jack = new Person('Jack', 25);

console.log(Jack.name); // Jack
Jack.sayHi(); // Hi, my name is Jack, I'm 25 years old.
console.log(Jack.age); // undefined
Jack.age = 30;
console.log(Jack.age); // 30
Jack.age = -10; // Invalid age value.
console.log(Jack.age); // 30

在上面的示例中,我们同样定义了一个 Person 的类,通过利用 get 和 set 关键字,将私有的 _age 属性暴露成了公共的 age 属性。其中,set 方法通过限制输入值的范围来模拟了私有属性的访问控制。这种方式相较于第一种方式更加简洁,而且语法也更清晰。

总之,对象的封装是面向对象编程必不可少的一部分,它可以保护内部数据的安全,避免外部对数据的直接操作和篡改。同时,良好的封装还可以使代码的重构和维护更加方便,提高了代码的可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript 面向对象编程基础:封装 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript实现简单购物小表格

    下面是“JavaScript实现简单购物小表格”的完整攻略: 1.准备工作 在HTML中,首先要准备一个表格元素,代码如下: <table> <thead> <tr> <th>商品</th> <th>价格</th> <th>数量</th> <th…

    JavaScript 2023年6月11日
    00
  • JavaScript数组reduce()方法的语法与实例解析

    JavaScript数组reduce()方法是常见的数组处理方法之一,它可以将数组中的所有元素通过一个指定的函数进行计算,得到一个最终的结果。 语法 reduce()方法的语法如下: arr.reduce(callback,[initialValue]) 其中,callback表示用于处理数组元素的函数,initialValue则表示指定的初始值。 call…

    JavaScript 2023年5月27日
    00
  • JavaScript实现点击图片换背景

    对于实现点击图片换背景的功能,我们可以通过以下步骤完成: 在HTML中添加需要更换背景的元素和切换背景用的按钮。 <body> <div id="content"> <h1>点击图片换背景</h1> <p>这是一个示例</p> <img id="bg-…

    JavaScript 2023年6月11日
    00
  • JavaScript常用的3种弹出框(提示框 alert/确认框 confirm/输入框 prompt)

    下面是关于 JavaScript 常用的3种弹出框的完整攻略: 弹出框概述 弹出框是我们在使用 JavaScript 时非常常见的交互方式,它所表现的形式有很多,其中最常见的就是提示框、确认框和输入框,分别由函数 alert()、confirm() 和 prompt() 提供支持。在实际开发中,我们可以根据具体需求调用不同的弹出框,来满足我们对用户操作的提示…

    JavaScript 2023年6月11日
    00
  • 基于javascript编写简单日历

    下面是详细的“基于JavaScript编写简单日历”的完整攻略。 Step 1:需求分析 在开始编写日历之前,我们需要对需求进行分析,以便能够更好地为用户提供服务。根据需求分析,我们需要实现以下功能: 显示当前的年份和月份; 显示当前月份的所有日期; 提供切换月份的功能。 Step 2:HTML布局 为了实现上述功能,我们需要先在HTML文件中编写一些基本的…

    JavaScript 2023年5月27日
    00
  • Android应用开发之代码混淆

    Android 应用开发之代码混淆 1.代码混淆的作用 代码混淆可以将原有 Java 代码反编译成的暴露的对应 Java 原代码格式的 Java 文件进行二次加密,改变其结构,提高代码保密性和防止逆向破解的能力。 在 Android 应用开发中,只编写 Java 代码是不够的。Android 应用也会包含 XML 、资源文件、native 库和其他二进制文件…

    JavaScript 2023年6月10日
    00
  • JavaScript必知必会(九)function 说起 闭包问题

    下面是我对“JavaScript必知必会(九)function 说起 闭包问题”的完整攻略。 什么是闭包 闭包是指函数和函数所能访问的外部变量之间的关系。可以理解为,一个函数能够“记住”在它被定义时所处的环境。 一个闭包的形成,需要满足以下条件: 函数嵌套:在一个函数内定义了另一个函数。 内层函数使用了外部变量:内层函数使用了外部函数所定义的变量。 外部函数…

    JavaScript 2023年6月10日
    00
  • 详解ECMAScript6入门–Class对象

    以下是详解ECMAScript6入门–Class对象的完整攻略: ECMAScript6入门–Class对象 Class对象的概念 Class语法是ES6中一个新的语法,它提供了更加简洁、清晰的面向对象编程方式。Class本质上是一个语法糖,它的出现让原型继承的写法更加清晰易懂。 在ES6之前,继承只能通过原型链来进行实现,而这样的实现方式并不是很直观,…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部