javascript - 为什么 Bootstrap 4 在 es6 类中使用私有(private)方法?

标签 javascript twitter-bootstrap class ecmascript-6 private

我查看了 Bootstrap 4 的源代码,发现他们使用 es6 类以及某种揭示模块模式。

这是取自 here 的代码的简化示例.

const Modal = (($) => {


  const NAME                         = 'modal'
  const VERSION                      = '4.0.0-alpha.3'
  ...

  const Default = {
    ...
  }


  class Modal {

    constructor(element, config) {
      this._config              = this._getConfig(config)
      this._element             = element
      ...
    }


    // public

    toggle(relatedTarget) {
      ...
    }

    show(relatedTarget) {
      ...
    }

    hide(event) {
      ...
    }

    dispose() {
      ...
    }


    // private

    _getConfig(config) {
      ...
    }

    _showElement(relatedTarget) {
      ...
    }

    _enforceFocus() {
      ...
    }

    _setEscapeEvent() {
      ...
    }

    _setResizeEvent() {
      ...
    }

  }

  return Modal

})(jQuery)

export default Modal

这将导致每个方法或属性都被暴露,包括私有(private)的。然而,这在最终产品中不会发生。例如,类似 $('#myModal').modal('_getConfig') 的内容将不起作用。发生了什么事?

最佳答案

它只是向 jQuery 原型(prototype)添加一个函数_jQueryInterface:

  $.fn[NAME]             = Modal._jQueryInterface
  $.fn[NAME].Constructor = Modal
  $.fn[NAME].noConflict  = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT
    return Modal._jQueryInterface
  }

  return Modal

})(jQuery)

如果您查看 _jQueryInterface 的代码,您会看到:

static _jQueryInterface(config, relatedTarget) {
  return this.each(function () {
    let data    = $(this).data(DATA_KEY)
    let _config = $.extend(
      {},
      Modal.Default,
      $(this).data(),
      typeof config === 'object' && config
    )

    if (!data) {
      data = new Modal(this, _config)
      $(this).data(DATA_KEY, data)
    }

    if (typeof config === 'string') {
      if (data[config] === undefined) {
        throw new Error(`No method named "${config}"`)
      }
      data[config](relatedTarget)
    } else if (_config.show) {
      data.show(relatedTarget)
    }
  })
}

如果我们仔细观察,您会发现 Modal 类的实例被保存为 data:

    if (!data) {
      data = new Modal(this, _config)
      $(this).data(DATA_KEY, data)
    }

您可以以与脚本相同的方式访问它(但仅在第一次创建它之后):

let data    = $(this).data(DATA_KEY)

DATA_KEYbs.modal

编辑:

$('#myModal').modal('_getConfig');

函数 _getConfig 实际上被调用,只是该函数返回 jQuery 对象,而不是 _getConfig 的结果是什么。

关于javascript - 为什么 Bootstrap 4 在 es6 类中使用私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685134/

相关文章:

c++ - 继承还是包容? C++

javascript - 一个 react 应用程序导入到另一个 react 应用程序中?

c++:检查对象数组中类的对象

javascript - 如何在 jquery 中按名称获取 html 元素?

html - 使用 bootstrap/css 根据屏幕大小更改背景图像的高度

html - Bootstrap 3/CSS : How to properly vertically align in panel heading

css - 使用 Bower 安装的 Bootstrap 时导航栏无法正确显示

c++ - 指向类中对象的指针,C++ 新手问题

javascript - 如何使变量的首字母始终大写?

javascript - 请解释为什么 .className 属性不起作用?