为什么Bootstrap 4在es6类中使用私有方法?

Pon*_*cks 2 javascript private class twitter-bootstrap ecmascript-6

我正在查看Bootstrap 4的源代码,我发现他们正在使用es6类以及某种显示模块模式.

以下是从此处获取的代码的简化示例.

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
Run Code Online (Sandbox Code Playgroud)

这将导致每个方法或属性被暴露,包括私有方法或属性.但是,这不会发生在最终产品中.例如,类似的东西$('#myModal').modal('_getConfig')不起作用.怎么了?

Min*_*our 5

它只为jQuery原型添加了一个函数_jQueryInterface:

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

  return Modal

})(jQuery)
Run Code Online (Sandbox Code Playgroud)

如果你看一下_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)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

如果仔细观察,您会看到Modal类的实例被保存为data:

    if (!data) {
      data = new Modal(this, _config)
      $(this).data(DATA_KEY, data)
    }
Run Code Online (Sandbox Code Playgroud)

您可以使用脚本执行的相同方式访问它(但只有在第一次创建它之后):

let data    = $(this).data(DATA_KEY)
Run Code Online (Sandbox Code Playgroud)

DATA_KEYbs.modal

编辑:

$('#myModal').modal('_getConfig');
Run Code Online (Sandbox Code Playgroud)

_getConfig实际上正在调用该函数,只是该函数返回jQuery对象而不是结果_getConfig.