【问题标题】:Using reveal pattern to make ES6 class properties private使用显示模式将 ES6 类属性设为私有
【发布时间】:2018-07-21 14:35:51
【问题描述】:

我想将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)

Xl 类中使用WeakMap 是否比这种方法更好? (鉴于我的库面向 IE 11+)

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

【问题讨论】:

  • 这与 ES6 类有什么关系?只是好奇。
  • 我的意思是,我在这里根本看不到使用 ES6 功能的痕迹。连模块语法都不是它
  • @oniondomes 我只是想指定Xl 是一个 ES6 类,因为我没有提供 Xl 类的源代码。我本可以使用export function Xiuli(selector){..},只是我的 eslint 抛出了 Prefer default export. (import/prefer-default-export) 警告。为什么我添加 es6-class 标签是因为我想隐藏 ES6 类的属性。
  • 我不认为函数成为 ES6 类只是因为有人说它是。您可能应该听过您的 linter 并将其替换为 export default....;从我的角度来看,混合模块样式远非一个好主意。至于您的实际问题,很难说出您的目标到底是什么,因此在您的情况下该怎么做会更好。在您提供的示例代码中,我根本不明白您为什么需要 Xl 函数。
  • 我的目标不是将函数转换为 ES6 类。我的目标是使用一些选择性方法返回一个对象,从而限制对下划线实例的直接操作。

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


【解决方案1】:

我是否违反了任何最佳做法或在这里做了坏事?

X1 的实现方式不再重要,因为您的库的用户再也看不到它了。不可能再利用它作为 ES6 class,例如能够从它继承。导出的Xiuli 只是一个返回对象字面量的工厂函数,这意味着即使instanceof 也不再起作用。

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

好吧,bind 也确实创建了新函数,但一点也不好,而且还有一个额外的对象字面量充当实际实例的包装器。这是否需要比构造函数范围的 getter 更多的内存取决于私有“属性”的数量与公共方法的数量。不过,工厂函数看起来并不容易使用,而且使用 getter 可能更 DRY。

【讨论】:

  • 私有“属性”的数量 > 公共方法的数量。用WeakMap怎么样?
  • 你总是可以这样做,它可能比创建任何特定于实例的函数对象对内存更友好。 (我只是个人不喜欢 WeakMap 语法)
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 2023-03-04
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多