告别随意改属性!用 ES6 Class 实现数据封装

JS 封装与私有属性:用 class 实现数据安全

在面向对象编程(OOP)中,封装是核心概念之一。它的目标就是:

保证对象内部数据的安全性,避免被外部随意修改。

在 JavaScript 中,我们可以使用 类(class)+ 私有属性(#开头) 来实现封装。


私有属性的语法

class 中,使用 # 开头的变量表示私有属性

这些属性只能在类的内部访问,外部无法直接修改或读取。

复制代码

class Person { // 定义私有属性 #name #age #gender constructor(name, age, gender) { this.#name = name this.#age = age this.#gender = gender } }


提供安全的访问方式

为了让外部能够"间接"访问私有数据,我们通常提供 gettersetter 方法。

这就是 封装的精髓 ------ 不直接暴露属性,而是通过方法来做校验安全访问

复制代码

class Person { #name #age #gender constructor(name, age, gender) { this.#name = name this.#age = age this.#gender = gender } // getter:安全获取数据 get age() { return this.#age } // setter:安全修改数据 set age(value) { if (value > 0 && value <= 120) { this.#age = value } else { console.warn('年龄不合法!') } } // 普通方法 sayHello() { console.log(`大家好,我是${this.#name},今年${this.#age}岁,性别:${this.#gender}`) } } const p1 = new Person('Linxi', 18, '女') p1.sayHello() console.log(p1.age) // 18 p1.age = 200 // 警告:年龄不合法!


常见错误点

  1. 私有属性必须先声明再使用

    复制代码

    class A { #x // 必须先写在类里 constructor(x) { this.#x = x } }

  2. 外部不能直接访问私有属性

    复制代码

    const a = new A(10) console.log(a.#x) // 语法错误,直接访问会报错

  3. getter / setter 建议简化命名

    不要写 get getAge() 这种,直接 get age() 即可,使用时更自然:

    复制代码

    console.log(p1.age) // getter p1.age = 20 // setter


小结

  • #属性名 → 声明私有属性,只能在类内部使用

  • getset → 提供对私有属性的安全访问

  • 封装的本质 → 限制数据的访问范围 + 提供安全的读写方式

通过这种方式,我们就能让对象的数据更安全,也让代码更具扩展性。

相关推荐
2501_920931701 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05281 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔1 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李1 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN1 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒1 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库2 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
方也_arkling2 小时前
Element Plus主题色定制
javascript·sass
电商API_180079052472 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
晓晓莺歌2 小时前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js