UNPKG

18.2 kBJavaScriptView Raw
1var _stock = {} // 核心存储容器
2var _stockData = {} //数据容器
3var uuid = -1;
4
5function getObjType(object){
6 return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
7}
8
9function uniqueId(prefix){
10 if (!prefix) prefix = 'random_'
11 uuid++
12 return prefix+uuid
13}
14
15function extend() {
16 var options, name, src, copy, copyIsArray, clone
17 , target = arguments[0] || {}
18 , i = 1
19 , length = arguments.length
20 , deep = false;
21 //如果第一个值为bool值,那么就将第二个参数作为目标参数,同时目标参数从2开始计数
22 if (typeof target === "boolean") {
23 deep = target;
24 target = arguments[1] || {};
25 // skip the boolean and the target
26 i = 2;
27 }
28 // 当目标参数不是object 或者不是函数的时候,设置成object类型的
29 // if (typeof target !== "object" && !jQuery.isFunction(target)) {
30 if (typeof target !== "object" && typeof target != 'function') {
31 target = {};
32 }
33 //如果extend只有一个函数的时候,那么将跳出后面的操作
34 if (length === i) {
35 // target = this;
36 if (Array.isArray(target)) target = []
37 if (getObjType(target) == 'Object') target = {}
38 --i;
39 }
40 for (; i < length; i++) {
41 // 仅处理不是 null/undefined values
42 if ((options = arguments[i]) != null) {
43 // 扩展options对象
44 for (name in options) {
45 src = target[name];
46 copy = options[name];
47 // 如果目标对象和要拷贝的对象是恒相等的话,那就执行下一个循环。
48 if (target === copy) {
49 continue;
50 }
51 // 如果我们拷贝的对象是一个对象或者数组的话
52 if (deep && copy && (getObjType(copy) === 'Object' || (copyIsArray = Array.isArray(copy)))) {
53 if (copyIsArray) {
54 copyIsArray = false;
55 clone = src && Array.isArray(src) ? src : [];
56 } else {
57 clone = src && getObjType(copy) === 'Object' ? src : {};
58 }
59 //不删除目标对象,将目标对象和原对象重新拷贝一份出来。
60 target[name] = extend(deep, clone, copy);
61 // 如果options[name]的不为空,那么将拷贝到目标对象上去。
62 } else if (copy !== undefined) {
63 target[name] = copy;
64 }
65 }
66 }
67 }
68 // 返回修改的目标对象
69 return target;
70};
71
72//统计store[name]是否首次执行
73var _count = {}
74var count = function(name) {
75 if (_count[name]) {
76 _count[name]++;
77 return true;
78 } else {
79 // 首次执行
80 _count[name] = 1;
81 return false;
82 }
83}
84
85var store = function( name, data, act ){
86 this.name = name || '';
87 this.sdata = data || {};
88 this.sact = act||{};
89 this.ctx = {"null":null};
90 var me = this;
91
92 this.dataer = function(data, key) {
93 var keyData;
94 if (key) keyData = _stockData[this.name+'.'+key]
95 if (!data) data = this.sdata
96 if (data || keyData) {
97 // this.sdata = data;
98 var _resault = [];
99 if (getObjType(this.sact) === 'Array') {
100 var acts = this.sact;
101 acts.map(function(fun) {
102 if (getObjType(fun.args) === 'Array') {
103 if (count(me.name)) {
104 fun.args.pop()
105 }
106 fun.args.push(data||{})
107 if (typeof fun === 'function') {
108 var _tmp = fun.apply(fun.args[0], [fun.args[0], data])
109 _resault.push(_tmp);
110 }
111 } else {
112 if (typeof fun === 'function') {
113 var _tmp = fun.call(me.ctx[me.name||'null'], data);
114 _resault.push(_tmp);
115 }
116 if (getObjType(fun)=='Object') {
117 Object.keys(fun).map(function(item){
118 if (typeof fun[item] == 'function'){
119 var _tmp = fun[item].call(me.ctx[me.name||'null'], data)
120 _resault.push(_tmp)
121 }
122 })
123 }
124 }
125 })
126 return _resault;
127 }
128 if (getObjType(this.sact) === 'Object') {
129 var sacts = this.sact
130 if (key) {
131 if (sacts[key]) {
132 var fun = sacts[key]
133 if (getObjType(fun.args) === 'Array') {
134 if (count(me.name)) {
135 fun.args.pop()
136 }
137 fun.args.push((keyData||data||{}))
138 if (typeof fun === 'function')
139 return fun.apply(fun.args[0], [fun.args[0], (keyData||data)])
140 } else {
141 if (typeof fun === 'function')
142 return fun.call(me.ctx[me.name||'null'], (keyData||data));
143 }
144 }
145 } else {
146 for (var item in sacts) {
147 var _keydata = _stockData[me.name+'.'+item]
148 if (typeof sacts[item] === 'function') {
149 var fun = sacts[item]
150 if (getObjType(fun.args) === 'Array') {
151 if (count(me.name)) {
152 fun.args.pop()
153 }
154 fun.args.push((data||_keydata||{}))
155 if (typeof fun === 'function'){
156 var _tmp = fun.apply(fun.args[0], [fun.args[0], (data||_keydata)])
157 _resault.push(_tmp)
158 }
159 } else {
160 if (typeof fun === 'function'){
161 var _tmp = fun.call(me.ctx[me.name||'null'], (data||_keydata));
162 _resault.push(_tmp)
163 }
164 }
165 }
166 }
167 return _resault
168 }
169 }
170 if (getObjType(this.sact) === 'Function') {
171 var fun = this.sact
172 if (Array.isArray(fun.args)) {
173 if (count(me.name)) { fun.args.pop() }
174 fun.args.push((data||_keydata||{}))
175 return typeof fun == 'function' ? fun.apply(fun.args[0], [fun.args[0], data]) : ''
176 } else {
177 return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null'], (data||_keydata)) : ''
178 }
179 }
180 } else {
181 var _resault = [];
182 if (getObjType(this.sact) === 'Array') {
183 var acts = this.sact;
184 var _resault = [];
185 acts.map(function(fun) {
186 if (getObjType(fun.args) === 'Array') {
187 if (typeof fun === 'function') {
188 var _tmp = fun.apply(fun.args[0], fun.args);
189 _resault.push(_tmp);
190 }
191 } else {
192 if (typeof fun === 'function') {
193 var _tmp = fun.call(me.ctx[me.name||'null']);
194 _resault.push(_tmp);
195 }
196 if (getObjType(fun)=='Object') {
197 Object.keys(fun).map(function(item){
198 if (typeof fun[item] == 'function'){
199 var _tmp = fun[item].call(me.ctx[me.name||'null'])
200 _resault.push(_tmp)
201 }
202 })
203 }
204 }
205 })
206 return _resault;
207 }
208 if (getObjType(this.sact) === 'Object') {
209 var sacts = this.sact
210 if (key) {
211 if (sacts[key]) {
212 var fun = sacts[key]
213 if (getObjType(fun.args) === 'Array') {
214 if (typeof fun === 'function'){
215 return fun.apply(fun.args[0], fun.args)
216 }
217 } else {
218 if (typeof fun === 'function')
219 return fun.call(me.ctx[me.name||'null']);
220 }
221 }
222 } else {
223 for (var item in sacts) {
224 var _keydata = _stockData[me.name+'.'+item]
225 if (typeof sacts[item] === 'function') {
226 var fun = sacts[item]
227 if (getObjType(fun.args) === 'Array') {
228 if (typeof fun === 'function'){
229 var _tmp = fun.apply(fun.args[0], [fun.args[0], _keydata])
230 _resault.push(_tmp);
231 }
232 } else {
233 if (typeof fun === 'function'){
234 var _tmp = fun.call(me.ctx[me.name||'null'], _keydata);
235 _resault.push(_tmp);
236 }
237 }
238 }
239 }
240 return _resault
241 }
242 }
243 if (getObjType(this.sact) === 'Function') {
244 var fun = this.sact
245 if (Array.isArray(fun.args)) {
246 return typeof fun == 'function' ? fun.apply(fun.args[0], fun.args) : ''
247 } else {
248 return typeof fun == 'function' ? fun.call(me.ctx[me.name||'null']) : ''
249 }
250 }
251 }
252 }
253
254 this.acter = function( act ){
255 var s_type = getObjType(this.sact)
256 var a_type = getObjType(act)
257
258 switch (s_type) {
259 case 'Object':
260 if (typeof act == 'object') this.sact = extend(true, this.sact, act)
261 else {
262 var _uuid = uniqueId()
263 if (typeof act == 'function') this.sact[_uuid] = act
264 }
265 break;
266 case 'Array':
267 switch (a_type) {
268 case 'Array':
269 this.sact = this.sact.concat(act)
270 break;
271 case 'Object':
272 this.sact = extend(true, this.sact, act)
273 break;
274 case 'Function':
275 this.sact = this.sact.push(act)
276 break;
277 }
278 break;
279 case 'Function':
280 switch (a_type) {
281 case 'Array':
282 this.sact = act.unshift(this.sact)
283 break;
284 case 'Object':
285 var _uuid = uniqueId()
286 this.sact = act[_uuid] = this.sact
287 break;
288 case 'Function':
289 this.sact = [this.sact, act]
290 break;
291 }
292 break;
293 default:
294 if (typeof act == 'function') this.sact = act
295 }
296 }
297
298 this.setter = function( data, act ){
299 if( data ) this.sdata = data;
300 if( act ) this.sact = act;
301 };
302
303 this.getter = function( type ){
304 if( type === 'action' ) return this.sact;
305 if( type === 'data') return this.sdata;
306 };
307
308 this.binder = function(ctx) {
309 this.ctx[this.name] = ctx
310 }
311}
312
313//like flux
314var storeAct = {
315 append: function(name, dataOrAct, fun){
316 if (!name || name == '') return false;
317
318 var save = _stock;
319
320 if (!save[name]) {
321 this.set(name, dataOrAct, fun)
322 return
323 }
324
325 var target;
326 var s_type = getObjType(save[name].sdata)
327 var d_type = getObjType(dataOrAct)
328
329 switch (s_type) {
330 case 'Array':
331 if (d_type == 'Array') {
332 save[name].sdata = save[name].sdata.concat(dataOrAct)
333 } else {
334 save[name].sdata.push(dataOrAct)
335 }
336 break;
337 case 'Object':
338 switch (d_type) {
339 case 'Object':
340 save[name].sdata = extend(true, {}, save[name].sdata, dataOrAct)
341 break;
342 default:
343 var _uuid = uniqueId(name+'_')
344 save[name].sdata[_uuid] = dataOrAct
345 }
346 break;
347 default:
348 save[name].sdata = [save[name].sdata, dataOrAct]
349 }
350 },
351
352 pop: function(name){
353 if (!name || name == '') return false;
354 var save = _stock;
355 if (save[name]) {
356 var tmp = save[name].getter('data')
357 if (getObjType(tmp) === 'Array') {
358 var popdata = tmp.pop();
359 save[name].setter(tmp)
360 return [tmp, popdata]
361 }
362 }
363 },
364
365 set: function(name, dataOrAct, fun){
366 if (!name || name == '') return false;
367 if (!dataOrAct) dataOrAct = {}
368 var save = _stock;
369 if (!save[name]) {
370 var thisStore = new store(name);
371 save[name] = thisStore;
372 }
373 if (dataOrAct && dataOrAct !== "") {
374 if (getObjType(dataOrAct) === 'Function') {
375 if (getObjType(fun) === 'Array') {
376 dataOrAct.args = fun;
377 } else {
378 if (fun) dataOrAct.args = [fun]
379 }
380 save[name].acter(dataOrAct);
381 } else {
382 if (getObjType(dataOrAct) === 'Object' || // 存储 json对象
383 getObjType(dataOrAct) === 'String' || // 存储 string
384 getObjType(dataOrAct) === 'Boolean') { // 存储 boolean对象
385 save[name].setter(dataOrAct);
386 }
387 else if (getObjType(dataOrAct) === 'Array') {
388 var isFuns = true;
389 if (!dataOrAct.length) {
390 save[name].setter([]);
391 } else {
392 dataOrAct.map(function(item, i) {
393 if (getObjType(item) !== 'Function') isFuns = false;
394 })
395 if (isFuns) {
396 if (getObjType(fun) === 'Array') {
397 dataOrAct.map(function(item, i) {
398 if (getObjType(fun[i]) === 'Array'){
399 item.args = fun[i];
400 } else {
401 if (fun[i]) item.args = [fun[i]]
402 }
403 })
404 }
405 save[name].acter(dataOrAct);
406 // save[name].sact = dataOrAct;
407 } else {
408 save[name].setter(dataOrAct); //存储array数据
409 }
410 }
411 }
412 }
413 }
414
415 if (fun) {
416 if (getObjType(fun) === 'Function') save[name].acter(fun);
417
418 if (getObjType(fun) === 'Array') {
419 var isFuns = true;
420 fun.map(function(item, i) {
421 if (getObjType(item) !== 'Function') isFuns = false;
422 })
423 if (isFuns) {
424 save[name].acter(fun);
425 }
426 }
427
428 if (getObjType(fun) === 'Object') {
429 save[name].acter(fun)
430 }
431 }
432
433 return SAX(name)
434 },
435
436 get: function(name){
437 if(!name||name=='') return;
438 var save = _stock;
439 if(save[name]){
440 return save[name].getter( 'data' )
441 } else {
442 return false;
443 }
444 },
445
446 setter: function(name, dataOrAct, fun) {
447 this.append(name, dataOrAct, fun)
448 return _stock[name].dataer(_stock[name].sdata)
449 },
450
451 getter: function(name){
452 if(!name||name=='') return;
453 var save = _stock;
454 if(save[name]){
455 var that = save[name]
456 function runner(data, key){
457 return that.dataer(data, key)
458 }
459 return {
460 run: runner,
461 data: save[name].getter( 'data' ),
462 action: save[name].getter( 'action' )
463 }
464 }
465 },
466
467 deleter: function( name ){
468 if(!name||name=='') return;
469 var save = _stock;
470 if(save[name]){
471 delete save[name];
472 }
473 },
474
475 runner: function( name, ddd, key, cb ){
476 if (!name || name == '') return false
477 var save = _stock
478 if (save[name]) {
479 var that = save[name]
480
481 function _runner(data, key) {
482 return that.dataer(data, key)
483 }
484
485 var _data = that.getter('data')
486
487 if (key && ddd) {
488 var keyofdata = name + '.' + key
489 _stockData[keyofdata] = typeof ddd == 'object' ? extend(true, ddd) : ddd
490 }
491 if (that.sact) return _runner((ddd||_data), key)
492 }
493 },
494
495 has: function(id, cb){
496 var keys = Object.keys(_stock)
497 if (keys.indexOf(id)>-1) {
498 var that = _stock[id]
499 if (typeof cb=='function') {
500 var _data = that.getter('data')
501 return cb(_data)
502 }
503 return true
504 }
505 },
506
507 lister: function(){
508 return Object.keys( _stock );
509 },
510
511 bind: function(name, ctx) {
512 if (!name || name == '') return;
513 var save = _stock;
514 if (!save[name]) save[name] = new store(name)
515 save[name].binder(ctx||null)
516 },
517
518 setActions: function(name, acts){
519 var save = _stock;
520 if (save[name]) {
521 save[name].acter(acts)
522 }
523 }
524}
525storeAct.trigger = storeAct.setter
526storeAct.roll = function(name, key, ddd){
527 if (typeof key == 'object') {
528 ddd = key
529 storeAct.runner(name, ddd)
530 } else {
531 storeAct.runner(name, ddd, key)
532 }
533}
534
535function sax(name, data, funs){
536 this.name = name
537 this.data = data
538 this.funs = funs
539 this.store = _stock[name]
540}
541sax.prototype = {
542 roll: function(key, data){
543 return storeAct.roll(this.name, key, data)
544 },
545 get: function(){
546 return storeAct.get(this.name)
547 },
548 append: function(data, fun){
549 storeAct.append(this.name, data, fun)
550 },
551 bind: function(ctx){
552 storeAct.bind(this.name, ctx)
553 },
554 has: function(id, cb){
555 return storeAct.has(id, cb)
556 },
557 pop: function(){
558 storeAct.pop(this.name)
559 },
560 trigger: function(data){
561 return storeAct.trigger(this.name, data)
562 }
563}
564
565var saxInstance = {}
566function SAX(name, data, funs){
567 if (name) {
568 var save = _stock;
569 if (save[name]) {
570 return saxInstance[name]
571 } else {
572 storeAct.set(name, data, funs)
573 var instance = new sax(name, data, funs)
574 saxInstance[name] = instance
575 return instance
576 }
577 }
578}
579
580var _keys = Object.keys(storeAct)
581_keys.map(function(item, ii){
582 SAX[item] = storeAct[item]
583})
584
585module.exports = SAX