首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6 WeakMap类封装

ES6 WeakMap类封装
EN

Stack Overflow用户
提问于 2018-05-28 11:24:32
回答 1查看 282关注 0票数 2

我试图理解为什么我需要使用WeakMaps来创建私有类成员,而不是仅仅使用一个普通变量。它们都使用闭包和模块导入来创建封装。

代码语言:javascript
复制
(function encapsulation() {
  const my_var = 'My secret info';
  const my_var2 = new WeakMap();

  class Test {
    constructor() {
      my_var2.set(this, 'My secret info 2');
      console.log(my_var); // My secret info
      console.log(my_var2.get(this)); // My secret info 2
    }
  }

  const t = new Test();
})();


console.log(my_var); // undefined
console.log(my_var2); // undefined

// Same result!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 11:28:49

my_var这样的普通变量的问题是,它只为类的单个实例化保存数据:

代码语言:javascript
复制
const Test = (function encapsulation() {
  let my_var = 'My secret info';

  class Test {
    constructor(param) {
      my_var = param;
    }
    getInfo() {
      return my_var;
    }
  }
  return Test;
})();

const t1 = new Test('foo');
const t2 = new Test('bar');
console.log(t1.getInfo());
// the above returns 'bar'... uh oh, but we passed in 'foo' to `t1`! Our data is lost!
console.log(t2.getInfo()); // 'bar'

因此,WeakMap需要为每个实例化保存单独的数据。

代码语言:javascript
复制
const Test = (function encapsulation() {
  const my_var2 = new WeakMap();

  class Test {
    constructor(param) {
      my_var2.set(this, param);
    }
    getInfo() {
      return my_var2.get(this);
    }
  }
  return Test;
})();

const t1 = new Test('foo');
const t2 = new Test('bar');
console.log(t1.getInfo()); // 'foo', as expected
console.log(t2.getInfo()); // 'bar', as expected

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50565295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档