为什么Bootstrap 4在es6类中使用私有方法
Why does Bootstrap 4 use private methods in es6 classes?
我查看了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
这将导致每个方法或属性都被公开,包括私有方法或属性。然而,这并不会发生在最终产品中。例如,像$('#myModal').modal('_getConfig')
这样的东西是不起作用的。发生了什么?
它只向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)
如果你查看_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_KEY
是bs.modal
编辑:
$('#myModal').modal('_getConfig');
函数_getConfig
实际上正在被调用,只是该函数正在返回jQuery对象,而不是_getConfig
的结果
相关文章:
- 为什么dijit.form.Select有方法setStore(),而dijit.fform.FilteringSele
- JSPM-是否有方法或需要对捆绑文件进行版本化
- 当用户试图删除indexedDB数据库时,是否有方法执行函数
- Box2dWeb中是否有方法将对象的位置.x输出到console.log()
- 是否有方法在WebCrypto API中获取RSA密钥的组件
- 是否有方法可以快速确定浏览器是否支持启用了cors的图像而不会污染浏览器?
- 是否有方法以编程方式确定私钥是用DER还是PEM编码的?
- 在反序列化JSON对象时,是否有方法将属性名称转换为小写?
- 是否有方法检查特定点(X,Y)是否在SVG元素中
- 是否有方法减少相同if语句的代码
- 是否有一个Bootstrap类的东西只在移动设备上消失
- 在babel编译时是否有方法注入或忽略全局变量?
- Node.js query:是否有方法提示用户自定义大小的数组
- 在检查字符串时,是否有方法包含单词变体(过去时,动名词)
- 当元素不处于悬停状态时,是否有方法获得元素的HOVER样式?
- 是否有方法检测和更改输入值格式
- 解析JSON字符串后是否有方法获得对象属性
- 检查对象是否有方法,而不实例化它
- 在附加到webRequest事件时,是否有方法访问匹配的URL模式
- Chrome扩展API的警报有方法明确,是不按文档工作