当前位置:首页 > JavaScript

js实现封装

2026-03-01 00:18:55JavaScript

封装的概念

封装是面向对象编程的核心概念之一,指将数据(属性)和操作数据的方法(行为)捆绑在一起,隐藏内部实现细节,仅暴露必要的接口。JavaScript 可通过多种方式实现封装。

使用构造函数和原型

通过构造函数定义对象的属性和方法,结合原型链共享方法,避免重复创建函数实例。

function Person(name, age) {
    this.name = name; // 公开属性
    let _age = age;   // 私有变量(通过闭包实现)

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

Person.prototype.greet = function() {
    console.log(`Hello, I'm ${this.name}`);
};

使用 ES6 的 Class 语法

ES6 的 class 语法糖简化了封装实现,结合 # 私有字段(ES2022)或闭包实现私有成员。

class Person {
    #age; // 私有字段(ES2022+)
    constructor(name, age) {
        this.name = name;
        this.#age = age;
    }

    getAge() { 
        return this.#age; 
    }

    setAge(age) { 
        this.#age = age; 
    }
}

闭包实现私有性

利用函数作用域和闭包隐藏私有变量,仅暴露公共接口。

const createPerson = (name, age) => {
    let _age = age; // 私有变量
    return {
        getName: () => name,
        getAge: () => _age,
        setAge: (newAge) => { _age = newAge; }
    };
};

模块模式

通过 IIFE(立即执行函数)返回对象,隔离作用域实现封装。

const personModule = (() => {
    let privateAge = 0;
    const privateMethod = () => console.log('Private');

    return {
        publicMethod: () => {
            privateMethod();
            console.log('Public');
        }
    };
})();

使用 WeakMap 存储私有数据

利用 WeakMap 的弱引用特性存储私有属性,避免内存泄漏。

js实现封装

const privateData = new WeakMap();

class Person {
    constructor(name, age) {
        privateData.set(this, { name, age });
    }

    getName() {
        return privateData.get(this).name;
    }
}

封装的原则

  • 最小暴露原则:仅暴露必要的接口。
  • 单一职责:每个模块或类专注于单一功能。
  • 不可变性:通过 Object.freeze() 防止对象被意外修改。

以上方法可根据场景选择,ES6 的 class 和私有字段是推荐的主流方案。

标签: js
分享给朋友:

相关文章

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…