详解ES6实现类的私有变量的几种写法
本文详细解析ES6中实现类私有变量的三种主流方案:利用闭包隔离变量、通过Symbol生成唯一键以及使用WeakMap存储状态。文章对比了各方案在内存占用、变量共享性及浏览器兼容性方面的差异,指出WeakMap方式因省内存、易回收且兼容性好,是目前最推荐的实现路径。
闭包实现类的私有变量方式
私有变量不共享
当使用 new 关键字实例化 person 构造函数时,this 指向新创建的实例(如 Tom),并在内存中开辟独立空间。每次实例化都会完整执行一遍构造函数逻辑。
class Person{
constructor(name){
let _num = 100;
this.name = name;
this.getNum = function(){
return _num;
}
this.addNum = function(){
return ++_num
}
}
}
const tom = new Person('tom')
const jack = new Person('jack')
tom.addNum()
console.log(tom.getNum()) //101
console.log(jack.getNum()) //100
私有变量可共享
若希望避免每个实例都生成独立的私有变量副本,从而解决变量无法共享的问题,可将私有变量定义在构造函数外部,并通过闭包机制返回该变量供所有实例使用。
const Person = (function () {
let _num = 100;
return class _Person {
constructor(name) {
this.name = name;
}
addNum() {
return ++_num
}
getNum() {
return _num
}
}
})()
const tom = new Person('tom')
const jack = new Person('jack')
tom.addNum()
console.log(tom.getNum()) //101
console.log(jack.getNum()) //101
结合上述两种策略,可以灵活实现既支持共享又支持独立的私有变量机制。
这种方式的缺点在于,每次实例化都会产生大量函数副本,导致内存消耗较大。
Symbol实现类的私有变量方式
symbol 简介:
Symbol 用于创建独一无二的值,所有 Symbol 实例互不相等。创建时可传入描述字符串(如 Symbol("desc"))。目前对象的键也支持使用 Symbol。
const name = Symbol('名字')
const person = { // 类名
[name]:'www',
say(){
console.log(`name is ${this[name]} `)
}
}
person.say()
console.log(name)
使用 Symbol 作为对象键无法通过常规迭代访问,也不能被 JSON 序列化,因此其核心作用是确保对象属性的唯一性。尽管无法直接遍历,仍可通过 Object.getOwnPropertySymbols() 获取。此外,新语法的浏览器兼容性尚不广泛。
symbol 实现类的私有变量
建议采用闭包方式创建 Symbol 的引用,使类的方法能够访问该引用。此举可避免将所有方法定义在构造函数内,防止每次创建新实例时重复开辟空间赋值方法,从而节省内存。
const Person = (function () {
let _num = Symbol('_num:私有变量');
return class _Person {
constructor(name) {
this.name = name;
this[_num] = 100
}
addNum() {
return ++this[_num]
}
getNum() {
return this[_num]
}
}
})()
const tom = new Person('tom')
const jack = new Person('jack')
console.log(tom.addNum()) //101
console.log(jack.getNum()) //100
通过 weakmap 创建私有变量
MDN 简介

实现:
const Parent = (function () {
const privates = new WeakMap();
return class Parent {
constructor() {
const me = {
data: "Private data goes here"
};
privates.set(this, me);
}
getP() {
const me = privates.get(this);
return me
}
}
})()
let p = new Parent()
console.log(p)
console.log(p.getP())
总结
综上所述,使用 WeakMap 实现类似私有变量的机制,具有节省内存、易于垃圾回收以及更广泛的浏览器兼容性优势,因此是最推荐的实现方式。
到此这篇关于详解ES6实现类的私有变量的几种写法的文章就介绍到这了,更多相关ES6 类的私有变量内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
