使用reveal模式将ES6类属性设为私有

时间:2018-02-11 07:22:43

标签: javascript design-patterns ecmascript-6 es6-class es6-modules

我想将Xl类(ES6类)属性设为私有,从而防止直接操作属性。我选择使用揭示模块模式如下,

index.js

import Xl from './xiuli';

function Xiuli(selector) {
  const xiuli = new Xl(selector);
  return {
    goto: xiuli.goto.bind(xiuli),
    pre: xiuli.pre.bind(xiuli),
    next: xiuli.next.bind(xiuli),
    onTransitionend: xiuli.onTransitionend.bind(xiuli),
  };
}
module.exports = Xiuli;

我是否违反任何最佳做法或在此处做坏事?特别是在xiuli.<method>.bind(xiuli)

WeakMap课程中使用Xl比使用此方法更好吗? (鉴于我的图书馆以IE 11 +为目标)

我熟悉在类构造函数中使用getter / setter的方法。但我不喜欢这种方法,因为它为每个新对象创建了新的函数实例。

1 个答案:

答案 0 :(得分:1)

  

我是否违反任何最佳做法或在此处做坏事?

X1的实施方式不再重要,因为您的图书馆用户不再看到它了。它不可能再利用它作为ES6 class,例如能够继承它。导出的Xiuli只是一个返回对象文字的工厂函数,这意味着instanceof甚至不再有效。

  

我熟悉在类构造函数中使用getter / setter的方法。但我不喜欢这种方法,因为它为每个新对象创建了新的函数实例。

嗯,bind确实创建了新的函数,它根本不是更好的,并且还有另外的对象文字作为实际实例的包装器。这是否需要比构造函数范围的getter更多的内存取决于私有“属性”的数量与公共方法的数量。工厂功能看起来并不容易使用,使用getter可能更干。