当前位置:首页 > 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实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现路由

js实现路由

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

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…