我对Java语言还很陌生,在研究开放源代码库时,范围界定语法确实使我感到困惑,特别是当它具有许多高级概念(如闭包,匿名函数等)时。Jquery Datatables RowGroup有点buggy具有响应能力,因此我大胆尝试编写自己的解决方案。
下面是RowGroup library中的相关代码段,https://cdn.datatables.net/rowgroup/1.1.1/js/dataTables.rowGroup.js中的源代码:
/** <Not sure what is going on here!> */
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery', 'datatables.net'], function ($) {
return factory($, window, document);
});
} else if (typeof exports === 'object') {
// CommonJS
module.exports = function (root, $) {
if (!root) {
root = window;
}
if (!$ || !$.fn.dataTable) {
$ = require('datatables.net')(root, $).$;
}
return factory($, root, root.document);
};
} else {
// Browser
factory(jQuery, window, document);
}
}(function ($, window, document, undefined) {
/** </Not sure what is going on here!> */
'use strict';
var DataTable = $.fn.dataTable;
var RowGroup = function (dt, opts) {
//...
};
$.extend(RowGroup.prototype, {
//...
_constructor: function () {
//...
dt.on('responsive-resize.dt', function () {
that._adjustColspan();
});
},
/** I would like to override this function, externally */
_adjustColspan: function () {
@ @override
}
});
}));
尽管它是open source,但我不想直接修改该库,而是想从一个单独的Javascript文件(该库之后将包括该函数)中覆盖函数_ adjustColspan。这将使库仍可轻松进行更新,并且可以轻松跟踪任何自定义更改。
因此,首先,我要完成的目标是否可行?如果可能,我将如何在外部.js文件中覆盖此功能?
编辑:看来我想做的是铸造的“ Monkey patching”
const RowGroup = $.fn.DataTable.RowGroup;
RowGroup.prototype._adjustColspan = function() {
// do your own things here
}
例如,您可以在开发工具中通过https://datatables.net/extensions/rowgroup/examples/styling/jqueryui.html进行测试。输入$.fn.DataTable.RowGroup.prototype
会给我们:
{
_adjustColspan: function _adjustColspan()
_colspan: function _colspan()
_constructor: function _constructor()
_draw: function _draw()
_group: function _group(b, g)
_groupDisplay: function _groupDisplay(b, a)
_rowWrap: function _rowWrap(b, g, c)
constructor: function h(b, g)
dataSrc: function dataSrc(b)
disable: function disable()
enable: function enable(b)
<prototype>: Object { … }
}