jmgraph 3.2.27 → 3.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/jmgraph.core.min.js +1 -1
  2. package/dist/jmgraph.core.min.js.map +1 -1
  3. package/dist/jmgraph.js +2657 -415
  4. package/dist/jmgraph.min.js +1 -1
  5. package/package.json +1 -1
  6. package/src/core/jmControl.js +824 -127
  7. package/src/core/jmEvents.js +154 -0
  8. package/src/core/jmFilter.js +38 -1
  9. package/src/core/jmGradient.js +47 -2
  10. package/src/core/jmGraph.js +51 -7
  11. package/src/core/jmLayer.js +34 -2
  12. package/src/core/jmList.js +167 -0
  13. package/src/core/jmObject.js +128 -8
  14. package/src/core/jmPath.js +43 -5
  15. package/src/core/jmProperty.js +181 -2
  16. package/src/core/jmShadow.js +36 -7
  17. package/src/core/jmUtils.js +149 -12
  18. package/src/lib/webgl/base.js +211 -83
  19. package/src/lib/webgl/core/buffer.js +43 -12
  20. package/src/lib/webgl/core/mapSize.js +16 -7
  21. package/src/lib/webgl/core/mapType.js +41 -22
  22. package/src/lib/webgl/core/program.js +94 -54
  23. package/src/lib/webgl/core/shader.js +20 -8
  24. package/src/lib/webgl/core/texture.js +55 -32
  25. package/src/lib/webgl/gradient.js +49 -17
  26. package/src/lib/webgl/index.js +173 -24
  27. package/src/lib/webgl/path.js +61 -12
  28. package/src/shapes/jmArc.js +48 -2
  29. package/src/shapes/jmArrow.js +35 -2
  30. package/src/shapes/jmArrowLine.js +33 -2
  31. package/src/shapes/jmBezier.js +50 -4
  32. package/src/shapes/jmCircle.js +35 -2
  33. package/src/shapes/jmEllipse.js +29 -3
  34. package/src/shapes/jmHArc.js +39 -2
  35. package/src/shapes/jmImage.js +49 -3
  36. package/src/shapes/jmLabel.js +41 -2
  37. package/src/shapes/jmLine.js +42 -2
  38. package/src/shapes/jmPolygon.js +42 -3
  39. package/src/shapes/jmPrismatic.js +34 -2
  40. package/src/shapes/jmRect.js +45 -3
  41. package/src/shapes/jmResize.js +42 -4
  42. package/src/shapes/jmStar.js +38 -4
@@ -1,14 +1,75 @@
1
+ /**
2
+ * @fileoverview jmEvents 事件处理系统
3
+ *
4
+ * jmEvents 是 jmGraph 库的事件处理模块,负责管理所有用户交互事件。
5
+ * 包括鼠标事件、触摸事件和键盘事件的绑定、分发和销毁。
6
+ *
7
+ * 主要功能:
8
+ * - 鼠标事件:mousedown, mousemove, mouseup, click, dblclick 等
9
+ * - 触摸事件:touchstart, touchmove, touchend, touchcancel, tap
10
+ * - 键盘事件:keydown, keyup, keypress
11
+ * - 事件冒泡和委托机制
12
+ *
13
+ * @module jmEvents
14
+ * @author jmGraph Team
15
+ * @license MIT
16
+ */
17
+
1
18
  import {jmUtils} from "./jmUtils.js";
2
19
 
20
+ /**
21
+ * jmEvents 事件处理类
22
+ *
23
+ * 统一管理画布上的所有交互事件,包括鼠标、触摸和键盘事件。
24
+ * 支持事件冒泡机制,可以将事件传递给子控件处理。
25
+ *
26
+ * @class jmEvents
27
+ *
28
+ * @param {jmGraph} container jmGraph 实例
29
+ * @param {HTMLElement} target 事件目标元素(通常是 canvas 元素)
30
+ *
31
+ * @example
32
+ * // 通常由 jmGraph 内部创建,不需要手动实例化
33
+ * const events = new jmEvents(graph, canvasElement);
34
+ */
3
35
  export default class jmEvents {
4
36
 
37
+ /**
38
+ * 构造函数
39
+ *
40
+ * @param {jmGraph} container jmGraph 实例
41
+ * @param {HTMLElement} target 事件目标元素
42
+ */
5
43
  constructor(container, target) {
44
+ /**
45
+ * jmGraph 实例
46
+ * @type {jmGraph}
47
+ */
6
48
  this.container = container;
49
+ /**
50
+ * 事件目标元素
51
+ * @type {HTMLElement}
52
+ */
7
53
  this.target = target || container;
54
+ /**
55
+ * 鼠标事件处理器
56
+ * @type {jmMouseEvent}
57
+ */
8
58
  this.mouseHandler = new jmMouseEvent(this, container, target);
59
+ /**
60
+ * 键盘事件处理器
61
+ * @type {jmKeyEvent}
62
+ */
9
63
  this.keyHandler = new jmKeyEvent(this, container, target);
10
64
  }
11
65
 
66
+ /**
67
+ * 触摸开始事件处理
68
+ *
69
+ * @method touchStart
70
+ * @param {TouchEvent} evt 触摸事件对象
71
+ * @return {boolean} 如果事件目标为画布本身则返回 false
72
+ */
12
73
  touchStart(evt) {
13
74
  evt = evt || window.event;
14
75
  evt.eventName = 'touchstart';
@@ -19,6 +80,13 @@ export default class jmEvents {
19
80
  }
20
81
  };
21
82
 
83
+ /**
84
+ * 触摸移动事件处理
85
+ *
86
+ * @method touchMove
87
+ * @param {TouchEvent} evt 触摸事件对象
88
+ * @return {boolean} 如果事件目标为画布本身则返回 false
89
+ */
22
90
  touchMove(evt) {
23
91
  evt = evt || window.event;
24
92
  evt.eventName = 'touchmove';
@@ -29,6 +97,13 @@ export default class jmEvents {
29
97
  }
30
98
  };
31
99
 
100
+ /**
101
+ * 触摸结束事件处理
102
+ *
103
+ * @method touchEnd
104
+ * @param {TouchEvent} evt 触摸事件对象
105
+ * @return {boolean} 如果事件目标为画布本身则返回 false
106
+ */
32
107
  touchEnd(evt) {
33
108
  evt = evt || window.event;
34
109
  evt.eventName = 'touchend';
@@ -40,6 +115,13 @@ export default class jmEvents {
40
115
  }
41
116
  };
42
117
 
118
+ /**
119
+ * 触摸取消事件处理
120
+ *
121
+ * @method touchCancel
122
+ * @param {TouchEvent} evt 触摸事件对象
123
+ * @return {boolean} 如果事件目标为画布本身则返回 false
124
+ */
43
125
  touchCancel(evt) {
44
126
  evt = evt || window.event;
45
127
  evt.eventName = 'touchcancel';
@@ -51,6 +133,13 @@ export default class jmEvents {
51
133
  }
52
134
  };
53
135
 
136
+ /**
137
+ * 轻触事件处理
138
+ *
139
+ * @method tap
140
+ * @param {Event} evt 事件对象
141
+ * @return {boolean} 如果事件目标为画布本身则返回 false
142
+ */
54
143
  tap(evt) {
55
144
  evt = evt || window.event;
56
145
  evt.eventName = 'tap';
@@ -62,23 +151,56 @@ export default class jmEvents {
62
151
  }
63
152
  };
64
153
 
154
+ /**
155
+ * 销毁事件处理器
156
+ *
157
+ * 移除所有绑定的事件监听器,释放资源。
158
+ *
159
+ * @method destroy
160
+ */
65
161
  destroy() {
66
162
  this.mouseHandler.destroy();
67
163
  this.keyHandler.destroy();
68
164
  }
69
165
  }
70
166
 
167
+ /**
168
+ * 鼠标事件处理器
169
+ *
170
+ * @class jmMouseEvent
171
+ * @private
172
+ */
71
173
  class jmMouseEvent {
174
+ /**
175
+ * 构造函数
176
+ *
177
+ * @param {jmEvents} instance jmEvents 实例
178
+ * @param {jmGraph} container jmGraph 实例
179
+ * @param {HTMLElement} target 事件目标元素
180
+ */
72
181
  constructor(instance, container, target) {
73
182
  this.instance = instance;
74
183
  this.container = container;
75
184
  this.target = target || container;
76
185
 
186
+ /**
187
+ * 已绑定的事件映射表
188
+ * @type {Object}
189
+ */
77
190
  this.eventEvents = {};
78
191
 
79
192
  this.init(instance, container, target);
80
193
  }
81
194
 
195
+ /**
196
+ * 初始化鼠标事件绑定
197
+ *
198
+ * @method init
199
+ * @private
200
+ * @param {jmEvents} instance jmEvents 实例
201
+ * @param {jmGraph} container jmGraph 实例
202
+ * @param {HTMLElement} target 事件目标元素
203
+ */
82
204
  init(instance, container, target) {
83
205
  const canvas = this.target;
84
206
  const doc = typeof document != 'undefined'? document: null;
@@ -163,6 +285,13 @@ class jmMouseEvent {
163
285
  },{ passive: false }));
164
286
  }
165
287
 
288
+ /**
289
+ * 销毁鼠标事件处理器
290
+ *
291
+ * 移除所有绑定的鼠标事件监听器。
292
+ *
293
+ * @method destroy
294
+ */
166
295
  destroy() {
167
296
  for(const name in this.eventEvents) {
168
297
  const event = this.eventEvents[name];
@@ -172,17 +301,42 @@ class jmMouseEvent {
172
301
  }
173
302
  }
174
303
 
304
+ /**
305
+ * 键盘事件处理器
306
+ *
307
+ * @class jmKeyEvent
308
+ * @private
309
+ */
175
310
  class jmKeyEvent {
311
+ /**
312
+ * 构造函数
313
+ *
314
+ * @param {jmEvents} instance jmEvents 实例
315
+ * @param {jmGraph} container jmGraph 实例
316
+ * @param {HTMLElement} target 事件目标元素
317
+ */
176
318
  constructor(instance, container,target) {
177
319
  this.instance = instance;
178
320
  this.container = container;
179
321
  this.target = target || container;
180
322
 
323
+ /**
324
+ * 已绑定的事件映射表
325
+ * @type {Object}
326
+ */
181
327
  this.eventEvents = {};
182
328
 
183
329
  this.init(container, target);
184
330
  }
185
331
 
332
+ /**
333
+ * 初始化键盘事件绑定
334
+ *
335
+ * @method init
336
+ * @private
337
+ * @param {jmGraph} container jmGraph 实例
338
+ * @param {HTMLElement} target 事件目标元素
339
+ */
186
340
  init(container, target) {
187
341
  const doc = typeof document != 'undefined'? document: null;
188
342
 
@@ -1,13 +1,50 @@
1
+ /**
2
+ * @fileoverview jmFilter 滤镜类
3
+ *
4
+ * jmFilter 提供了 CSS 滤镜效果的管理和应用功能。
5
+ * 支持多种滤镜效果,可以组合使用。
6
+ *
7
+ * 支持的滤镜:
8
+ * - blur: 模糊效果
9
+ * - grayscale: 灰度效果
10
+ * - sepia: 复古效果
11
+ * - brightness: 亮度调节
12
+ * - contrast: 对比度调节
13
+ * - saturate: 饱和度调节
14
+ * - hue-rotate: 色相旋转
15
+ * - invert: 反色效果
16
+ * - opacity: 透明度调节
17
+ *
18
+ * @module jmFilter
19
+ * @author jmGraph Team
20
+ * @license MIT
21
+ */
22
+
1
23
  import {jmUtils} from "./jmUtils.js";
2
24
 
3
25
  /**
4
- * CSS滤镜效果类
26
+ * CSS 滤镜效果类
27
+ *
5
28
  * 支持的滤镜: blur, grayscale, sepia, brightness, contrast, saturate, hue-rotate, invert, opacity
6
29
  *
7
30
  * @class jmFilter
8
31
  * @param {string|object} opt 滤镜参数
9
32
  * 字符串格式: "blur(2px) grayscale(50%) brightness(1.2)"
10
33
  * 对象格式: { blur: 2, grayscale: 0.5, brightness: 1.2 }
34
+ *
35
+ * @example
36
+ * // 从字符串创建
37
+ * const filter = new jmFilter('blur(2px) grayscale(50%)');
38
+ *
39
+ * // 从对象创建
40
+ * const filter = new jmFilter({
41
+ * blur: 2,
42
+ * grayscale: 0.5,
43
+ * brightness: 1.2
44
+ * });
45
+ *
46
+ * // 应用到图形
47
+ * shape.style.filter = filter;
11
48
  */
12
49
  export default class jmFilter {
13
50
  constructor(opt) {
@@ -1,11 +1,56 @@
1
+ /**
2
+ * @fileoverview jmGradient 渐变类
3
+ *
4
+ * jmGradient 提供了线性渐变和径向渐变的创建和管理功能。
5
+ * 支持从 CSS 渐变字符串解析,以及转换为 Canvas 渐变对象。
6
+ *
7
+ * 主要功能:
8
+ * - 线性渐变(linear-gradient)
9
+ * - 径向渐变(radial-gradient)
10
+ * - CSS 渐变字符串解析
11
+ * - Canvas 渐变对象生成
12
+ * - WebGL 渐变支持
13
+ *
14
+ * @module jmGradient
15
+ * @author jmGraph Team
16
+ * @license MIT
17
+ */
18
+
1
19
  import {jmUtils, colorKeywords} from "./jmUtils.js";
2
20
  import {jmList} from "./jmList.js";
3
21
 
4
22
  /**
5
23
  * 渐变类
6
- *
24
+ *
25
+ * 用于创建和管理线性渐变或径向渐变效果。
26
+ * 支持 CSS 渐变字符串格式解析,可以转换为 Canvas 或 WebGL 兼容的渐变对象。
27
+ *
7
28
  * @class jmGradient
8
- * @param {object} op 渐变参数,type:[linear= 线性渐变,radial=放射性渐变]
29
+ *
30
+ * @param {Object|string} opt 渐变参数对象或 CSS 渐变字符串
31
+ * @param {string} [opt.type='linear'] 渐变类型:'linear' 或 'radial'
32
+ * @param {number|string} [opt.x1] 起点X坐标(支持百分比)
33
+ * @param {number|string} [opt.y1] 起点Y坐标(支持百分比)
34
+ * @param {number|string} [opt.x2] 终点X坐标(支持百分比)
35
+ * @param {number|string} [opt.y2] 终点Y坐标(支持百分比)
36
+ * @param {number|string} [opt.r1] 内圆半径(径向渐变)
37
+ * @param {number|string} [opt.r2] 外圆半径(径向渐变)
38
+ * @param {Array} [opt.stops] 颜色停止点数组 [{offset, color}, ...]
39
+ *
40
+ * @example
41
+ * // 创建线性渐变
42
+ * const gradient = new jmGradient({
43
+ * type: 'linear',
44
+ * x1: 0, y1: 0,
45
+ * x2: '100%', y2: '100%',
46
+ * stops: [
47
+ * { offset: 0, color: '#ff0000' },
48
+ * { offset: 1, color: '#0000ff' }
49
+ * ]
50
+ * });
51
+ *
52
+ * // 从 CSS 字符串创建
53
+ * const gradient = new jmGradient('linear-gradient(180deg, #ff0000, #0000ff)');
9
54
  */
10
55
  export default class jmGradient {
11
56
  constructor(opt) {
@@ -1,3 +1,23 @@
1
+ /**
2
+ * @fileoverview jmGraph 主画布类
3
+ *
4
+ * jmGraph 是 jmGraph 库的核心类,代表一个完整的画布实例。
5
+ * 它继承自 jmControl,提供了完整的图形渲染、事件处理、缩放平移等功能。
6
+ *
7
+ * 主要功能:
8
+ * - Canvas/WebGL 双渲染模式支持
9
+ * - 图形创建与管理(createShape, createLine, createPath 等)
10
+ * - 渐变和阴影效果(createLinearGradient, createRadialGradient, createShadow)
11
+ * - 缩放和平移(setZoom, pan, resetTransform)
12
+ * - 导出功能(toDataURL, exportToPNG, exportToJPEG, exportToSVG)
13
+ * - 自动刷新动画循环(autoRefresh)
14
+ * - 微信小程序支持
15
+ *
16
+ * @module jmGraph
17
+ * @author jmGraph Team
18
+ * @license MIT
19
+ */
20
+
1
21
  import {jmUtils} from "./jmUtils.js";
2
22
  import {jmList} from "./jmList.js";
3
23
  import {jmProperty} from './jmProperty.js';
@@ -9,15 +29,39 @@ import {jmControl} from "./jmControl.js";
9
29
  import {jmPath} from "./jmPath.js";
10
30
 
11
31
  /**
12
- * jmGraph画图类库
13
- * 对canvas画图api进行二次封装,使其更易调用,省去很多重复的工作。
14
- *
15
- * @module jmGraph
32
+ * jmGraph 画图类
33
+ *
34
+ * 对 Canvas 画图 API 进行二次封装,使其更易调用,省去很多重复的工作。
35
+ * 支持多种图形的创建、渲染、交互和导出。
36
+ *
16
37
  * @class jmGraph
17
38
  * @extends jmControl
18
- * @param {element} canvas 标签canvas
19
- * @param {object} option 参数:{width:宽,height:高}
20
- * @param {function} callback 初始化后的回调
39
+ *
40
+ * @param {HTMLElement|string} canvas Canvas 元素或元素 ID
41
+ * @param {Object} [option] 配置选项
42
+ * @param {number} [option.width] 画布宽度
43
+ * @param {number} [option.height] 画布高度
44
+ * @param {string} [option.mode='2d'] 渲染模式:'2d' 或 'webgl'
45
+ * @param {boolean} [option.autoRefresh=false] 是否自动刷新
46
+ * @param {Object} [option.shapes] 自定义图形类型映射
47
+ * @param {function} [callback] 初始化完成后的回调函数
48
+ *
49
+ * @example
50
+ * // 创建画布实例
51
+ * const graph = new jmGraph('canvasId', {
52
+ * width: 800,
53
+ * height: 600,
54
+ * mode: '2d'
55
+ * });
56
+ *
57
+ * // 创建一个矩形
58
+ * const rect = graph.createShape('rect', {
59
+ * x: 100, y: 100,
60
+ * width: 200, height: 150,
61
+ * style: { fill: '#ff0000' }
62
+ * });
63
+ * graph.children.add(rect);
64
+ * graph.refresh();
21
65
  */
22
66
  export default class jmGraph extends jmControl {
23
67
 
@@ -1,9 +1,27 @@
1
+ /**
2
+ * @fileoverview jmLayer 图层类
3
+ *
4
+ * jmLayer 提供了图层管理功能,用于组织和控制图形对象的显示和交互。
5
+ * 图层可以包含多个图形对象,支持可见性和锁定控制。
6
+ *
7
+ * 主要功能:
8
+ * - 图层可见性控制
9
+ * - 图层锁定(防止交互)
10
+ * - 图形对象组织和管理
11
+ * - 批量操作支持
12
+ *
13
+ * @module jmLayer
14
+ * @author jmGraph Team
15
+ * @license MIT
16
+ */
17
+
1
18
  import {jmControl} from "./jmControl.js";
2
19
 
3
20
  /**
4
21
  * 图层类
5
- * 用于组织和管理图形对象,支持可见性和锁定控制
6
- * 图层可以包含多个图形对象,并控制它们的显示和交互
22
+ *
23
+ * 用于组织和管理图形对象,支持可见性和锁定控制。
24
+ * 图层可以包含多个图形对象,并控制它们的显示和交互。
7
25
  *
8
26
  * @class jmLayer
9
27
  * @extends jmControl
@@ -12,6 +30,20 @@ import {jmControl} from "./jmControl.js";
12
30
  * @param {boolean} [params.visible=true] 图层是否可见
13
31
  * @param {boolean} [params.locked=false] 图层是否锁定(锁定后不可交互)
14
32
  * @param {jmGraph} [params.graph] 所属的画布对象
33
+ *
34
+ * @example
35
+ * // 创建图层
36
+ * const layer = new jmLayer({
37
+ * name: 'background',
38
+ * visible: true,
39
+ * locked: false
40
+ * });
41
+ *
42
+ * // 添加图形到图层
43
+ * layer.children.add(rect);
44
+ *
45
+ * // 锁定图层
46
+ * layer.locked = true;
15
47
  */
16
48
  export default class jmLayer extends jmControl {
17
49
 
@@ -1,4 +1,54 @@
1
+ /**
2
+ * @fileoverview jmList 列表类
3
+ *
4
+ * jmList 是 jmGraph 库的集合类,继承自原生 Array。
5
+ * 提供了增强的列表操作方法,包括去重添加、条件查找、遍历等。
6
+ *
7
+ * 主要功能:
8
+ * - 去重添加元素(add)
9
+ * - 条件查找(get)
10
+ * - 正向/反向遍历(each)
11
+ * - 元素计数(count)
12
+ * - 移除回调支持
13
+ *
14
+ * @module jmList
15
+ * @author jmGraph Team
16
+ * @license MIT
17
+ */
18
+
19
+ /**
20
+ * jmList 列表类
21
+ *
22
+ * 继承自 Array 的增强列表类,提供去重、遍历、查找等功能。
23
+ * 主要用于管理图形对象的子元素集合。
24
+ *
25
+ * @class jmList
26
+ * @extends Array
27
+ *
28
+ * @param {...*} arg 初始元素或数组
29
+ *
30
+ * @example
31
+ * // 创建列表
32
+ * const list = new jmList([1, 2, 3]);
33
+ *
34
+ * // 添加元素(自动去重)
35
+ * list.add(4);
36
+ * list.add([5, 6]);
37
+ *
38
+ * // 遍历
39
+ * list.each((index, item) => {
40
+ * console.log(index, item);
41
+ * });
42
+ *
43
+ * // 条件查找
44
+ * const found = list.get(item => item > 3);
45
+ */
1
46
  export default class jmList extends Array {
47
+ /**
48
+ * 构造函数
49
+ *
50
+ * @param {...*} arg 初始元素或数组
51
+ */
2
52
  constructor(...arg) {
3
53
  const ps = [];
4
54
  if(arg && arg.length && Array.isArray(arg[0])) {
@@ -8,10 +58,33 @@ export default class jmList extends Array {
8
58
  else {
9
59
  super();
10
60
  }
61
+ /**
62
+ * 配置选项
63
+ * @type {Object}
64
+ * @property {function} removeHandler 元素移除时的回调函数
65
+ */
11
66
  this.option = {};
67
+ /**
68
+ * 类型标识
69
+ * @type {string}
70
+ */
12
71
  this.type = 'jmList';
13
72
  }
14
73
 
74
+ /**
75
+ * 添加元素到列表
76
+ *
77
+ * 自动去重,如果元素已存在则不会重复添加。
78
+ * 支持添加单个元素或数组。
79
+ *
80
+ * @method add
81
+ * @param {*} obj 要添加的元素或数组
82
+ * @returns {*} 添加的元素
83
+ *
84
+ * @example
85
+ * list.add(1); // 添加单个元素
86
+ * list.add([2, 3, 4]); // 添加数组
87
+ */
15
88
  add(obj) {
16
89
  if(obj && Array.isArray(obj)) {
17
90
  for(let i=0; i < obj.length; i++) {
@@ -24,6 +97,17 @@ export default class jmList extends Array {
24
97
  return obj;
25
98
  }
26
99
 
100
+ /**
101
+ * 从列表中移除元素
102
+ *
103
+ * 移除所有匹配的元素,并触发移除回调。
104
+ *
105
+ * @method remove
106
+ * @param {*} obj 要移除的元素
107
+ *
108
+ * @example
109
+ * list.remove(item);
110
+ */
27
111
  remove(obj) {
28
112
  for(let i = this.length -1; i>=0; i--) {
29
113
  if(this[i] == obj) {
@@ -32,6 +116,15 @@ export default class jmList extends Array {
32
116
  }
33
117
  }
34
118
 
119
+ /**
120
+ * 移除指定索引位置的元素
121
+ *
122
+ * @method removeAt
123
+ * @param {number} index 要移除的元素索引
124
+ *
125
+ * @example
126
+ * list.removeAt(0); // 移除第一个元素
127
+ */
35
128
  removeAt(index) {
36
129
  if(this.length > index) {
37
130
  const obj = this[index];
@@ -40,10 +133,39 @@ export default class jmList extends Array {
40
133
  }
41
134
  }
42
135
 
136
+ /**
137
+ * 检查列表是否包含指定元素
138
+ *
139
+ * @method contain
140
+ * @param {*} obj 要检查的元素
141
+ * @returns {boolean} 如果包含返回 true,否则返回 false
142
+ *
143
+ * @example
144
+ * if (list.contain(item)) {
145
+ * console.log('元素存在');
146
+ * }
147
+ */
43
148
  contain(obj) {
44
149
  return this.includes(obj);
45
150
  }
46
151
 
152
+ /**
153
+ * 获取元素
154
+ *
155
+ * 如果参数是函数,则返回第一个满足条件的元素;
156
+ * 如果参数是数字,则返回指定索引的元素。
157
+ *
158
+ * @method get
159
+ * @param {number|function} index 索引或条件函数
160
+ * @returns {*} 找到的元素,如果未找到返回 undefined
161
+ *
162
+ * @example
163
+ * // 按索引获取
164
+ * const item = list.get(0);
165
+ *
166
+ * // 按条件查找
167
+ * const found = list.get(item => item.id === 5);
168
+ */
47
169
  get(index) {
48
170
  if(typeof index == 'function') {
49
171
  return this.find(index);
@@ -53,6 +175,27 @@ export default class jmList extends Array {
53
175
  }
54
176
  }
55
177
 
178
+ /**
179
+ * 遍历列表
180
+ *
181
+ * 支持正向和反向遍历。在回调中返回 false 可以中断遍历。
182
+ *
183
+ * @method each
184
+ * @param {function} cb 回调函数,参数为 (index, item)
185
+ * @param {boolean} [inverse=false] 是否反向遍历
186
+ *
187
+ * @example
188
+ * // 正向遍历
189
+ * list.each((index, item) => {
190
+ * console.log(index, item);
191
+ * if (item.id === 3) return false; // 中断遍历
192
+ * });
193
+ *
194
+ * // 反向遍历
195
+ * list.each((index, item) => {
196
+ * console.log(index, item);
197
+ * }, true);
198
+ */
56
199
  each(cb, inverse) {
57
200
  if(cb && typeof cb == 'function') {
58
201
  if(inverse) {
@@ -71,6 +214,20 @@ export default class jmList extends Array {
71
214
  }
72
215
  }
73
216
 
217
+ /**
218
+ * 统计元素数量
219
+ *
220
+ * 如果提供了条件函数,返回满足条件的元素数量;
221
+ * 否则返回列表总长度。
222
+ *
223
+ * @method count
224
+ * @param {function} [handler] 条件函数
225
+ * @returns {number} 元素数量
226
+ *
227
+ * @example
228
+ * const total = list.count(); // 总数量
229
+ * const matched = list.count(item => item.active); // 满足条件的数量
230
+ */
74
231
  count(handler) {
75
232
  if(handler && typeof handler == 'function') {
76
233
  let count = 0;
@@ -85,6 +242,16 @@ export default class jmList extends Array {
85
242
  return this.length;
86
243
  }
87
244
 
245
+ /**
246
+ * 清空列表
247
+ *
248
+ * 移除列表中的所有元素。
249
+ *
250
+ * @method clear
251
+ *
252
+ * @example
253
+ * list.clear();
254
+ */
88
255
  clear() {
89
256
  this.splice(0, this.length);
90
257
  }