当前位置:首页 > JavaScript

js 实现封装

2026-04-05 05:05:12JavaScript

封装的概念

封装是面向对象编程的三大特性之一,用于隐藏对象的内部细节,仅暴露必要的接口。在JavaScript中,封装可以通过多种方式实现,包括使用闭包、Symbol、WeakMap以及ES6的class语法。

使用闭包实现封装

闭包是JavaScript中实现私有变量的常见方法。通过函数作用域,可以创建只能在函数内部访问的变量。

function createCounter() {
    let count = 0; // 私有变量

    return {
        increment: function() {
            count++;
        },
        getCount: function() {
            return count;
        }
    };
}

const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
console.log(counter.count); // 输出: undefined

使用Symbol实现私有属性

Symbol是ES6引入的唯一值类型,可以用作对象的私有属性键。

const _count = Symbol('count');

class Counter {
    constructor() {
        this[_count] = 0;
    }

    increment() {
        this[_count]++;
    }

    getCount() {
        return this[_count];
    }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
console.log(counter[_count]); // 输出: 1(但仍可通过Symbol访问)

使用WeakMap实现私有属性

WeakMap可以更好地隐藏私有属性,外部无法直接访问。

const _private = new WeakMap();

class Counter {
    constructor() {
        _private.set(this, { count: 0 });
    }

    increment() {
        const data = _private.get(this);
        data.count++;
    }

    getCount() {
        return _private.get(this).count;
    }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
console.log(counter.count); // 输出: undefined

使用ES6 class的私有字段

ES2022引入了私有字段语法,通过#前缀标识私有属性。

js 实现封装

class Counter {
    #count = 0; // 私有字段

    increment() {
        this.#count++;
    }

    getCount() {
        return this.#count;
    }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
console.log(counter.#count); // 报错: Private field '#count' must be declared in an enclosing class

封装的优势

封装的主要优势在于保护对象的内部状态,避免外部直接修改导致的不一致性。通过暴露有限的接口,可以更好地控制数据的访问和修改逻辑,提高代码的可维护性和安全性。

标签: js
分享给朋友:

相关文章

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…