详解ES6实现类的私有变量的几种写法

作者:青柠时间:2026-10-24 07:50:55浏览:78

本文详细解析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 类的私有变量内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章