美文网首页工作生活
使用 WeakMap 实现私有属性与方法

使用 WeakMap 实现私有属性与方法

作者: SingleDiego | 来源:发表于2019-07-05 10:35 被阅读0次

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakMap




Javascript 的 WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

设定一个 WeakMap 对象, 第一个参数为键(这里是对象 o),第二个参数为值,可以为任何值包括另一个对象:

let o = {};
let w = new WeakMap().set(o, '123');

返回关联的值:

w.get(o)
"123"

检查是否含有某个键:

w.has(o)
// true

删除某个键:

w.delete(o)




利用 WeakMap 的特性我们可以实现私有属性。

const _radius = new WeakMap();

class Circle {
  constructor(radius) {
    // 私有属性
    _radius.set(this, radius);
  };
}

let c = new Circle(1);

我们这样获取私有属性的值:

const _radius = new WeakMap();

class Circle {
  constructor(radius) {
    // 私有属性
    _radius.set(this, radius);
  };

  draw() {
    // 获取私有属性的值
    console.log(_radius.get(this));
  };
}

要实现私有方法,较好的办法是使用箭头函数解决 this 绑定的问题。

const _radius = new WeakMap();
const _move = new WeakMap();

class Circle {
  constructor(radius) {
    // 私有属性
    _radius.set(this, radius);
    
    // 私有方法
    _move.set(this, () => {
      console.log('move', this);
    });
  }

  draw() {
    // 调用私有方法
    _move.get(this)();
  }
}

演示一下:

let c = new Circle(1);

c.draw()
// move Circle {}

现在 this 指向实例自身。

相关文章

网友评论

    本文标题:使用 WeakMap 实现私有属性与方法

    本文链接:https://www.haomeiwen.com/subject/lolrhctx.html