当前位置:首页 > JavaScript

js实现封装

2026-03-01 00:18:55JavaScript

封装的概念

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

使用构造函数和原型

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

js实现封装

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; 
    }
}

闭包实现私有性

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

js实现封装

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 的弱引用特性存储私有属性,避免内存泄漏。

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实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableElem…

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounc…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…