SOURCE

console 命令行工具 X clear

                    
>
console
(function() {
	function n(n) {
		function t(t, r, e, u, i, o) {
			for(; i >= 0 && o > i; i += n) {
				var a = u ? u[i] : i;
				e = r(e, t[a], a, t)
			}
			return e
		}
		return function(r, e, u, i) {
			e = b(e, i, 4);
			var o = !k(r) && m.keys(r),
				a = (o || r).length,
				c = n > 0 ? 0 : a - 1;
			return arguments.length < 3 && (u = r[o ? o[c] : c], c += n), t(r, e, u, o, c, a)
		}
	}

	function t(n) {
		return function(t, r, e) {
			r = x(r, e);
			for(var u = O(t), i = n > 0 ? 0 : u - 1; i >= 0 && u > i; i += n)
				if(r(t[i], i, t)) return i;
			return -1
		}
	}

	function r(n, t, r) {
		return function(e, u, i) {
			var o = 0,
				a = O(e);
			if("number" == typeof i) n > 0 ? o = i >= 0 ? i : Math.max(i + a, o) : a = i >= 0 ? Math.min(i + 1, a) : i + a + 1;
			else if(r && i && a) return i = r(e, u), e[i] === u ? i : -1;
			if(u !== u) return i = t(l.call(e, o, a), m.isNaN), i >= 0 ? i + o : -1;
			for(i = n > 0 ? o : a - 1; i >= 0 && a > i; i += n)
				if(e[i] === u) return i;
			return -1
		}
	}

	function e(n, t) {
		var r = I.length,
			e = n.constructor,
			u = m.isFunction(e) && e.prototype || a,
			i = "constructor";
		for(m.has(n, i) && !m.contains(t, i) && t.push(i); r--;) i = I[r], i in n && n[i] !== u[i] && !m.contains(t, i) && t.push(i)
	}
	var u = this,
		i = u._,
		o = Array.prototype,
		a = Object.prototype,
		c = Function.prototype,
		f = o.push,
		l = o.slice,
		s = a.toString,
		p = a.hasOwnProperty,
		h = Array.isArray,
		v = Object.keys,
		g = c.bind,
		y = Object.create,
		d = function() {},
		m = function(n) {
			return n instanceof m ? n : this instanceof m ? void(this._wrapped = n) : new m(n)
		};
	"undefined" != typeof exports ? ("undefined" != typeof module && module.exports && (exports = module.exports = m), exports._ = m) : u._ = m, m.VERSION = "1.8.3";
	var b = function(n, t, r) {
			if(t === void 0) return n;
			switch(null == r ? 3 : r) {
				case 1:
					return function(r) {
						return n.call(t, r)
					};
				case 2:
					return function(r, e) {
						return n.call(t, r, e)
					};
				case 3:
					return function(r, e, u) {
						return n.call(t, r, e, u)
					};
				case 4:
					return function(r, e, u, i) {
						return n.call(t, r, e, u, i)
					}
			}
			return function() {
				return n.apply(t, arguments)
			}
		},
		x = function(n, t, r) {
			return null == n ? m.identity : m.isFunction(n) ? b(n, t, r) : m.isObject(n) ? m.matcher(n) : m.property(n)
		};
	m.iteratee = function(n, t) {
		return x(n, t, 1 / 0)
	};
	var _ = function(n, t) {
			return function(r) {
				var e = arguments.length;
				if(2 > e || null == r) return r;
				for(var u = 1; e > u; u++)
					for(var i = arguments[u], o = n(i), a = o.length, c = 0; a > c; c++) {
						var f = o[c];
						t && r[f] !== void 0 || (r[f] = i[f])
					}
				return r
			}
		},
		j = function(n) {
			if(!m.isObject(n)) return {};
			if(y) return y(n);
			d.prototype = n;
			var t = new d;
			return d.prototype = null, t
		},
		w = function(n) {
			return function(t) {
				return null == t ? void 0 : t[n]
			}
		},
		A = Math.pow(2, 53) - 1,
		O = w("length"),
		k = function(n) {
			var t = O(n);
			return "number" == typeof t && t >= 0 && A >= t
		};
	m.each = m.forEach = function(n, t, r) {
		t = b(t, r);
		var e, u;
		if(k(n))
			for(e = 0, u = n.length; u > e; e++) t(n[e], e, n);
		else {
			var i = m.keys(n);
			for(e = 0, u = i.length; u > e; e++) t(n[i[e]], i[e], n)
		}
		return n
	}, m.map = m.collect = function(n, t, r) {
		t = x(t, r);
		for(var e = !k(n) && m.keys(n), u = (e || n).length, i = Array(u), o = 0; u > o; o++) {
			var a = e ? e[o] : o;
			i[o] = t(n[a], a, n)
		}
		return i
	}, m.reduce = m.foldl = m.inject = n(1), m.reduceRight = m.foldr = n(-1), m.find = m.detect = function(n, t, r) {
		var e;
		return e = k(n) ? m.findIndex(n, t, r) : m.findKey(n, t, r), e !== void 0 && e !== -1 ? n[e] : void 0
	}, m.filter = m.select = function(n, t, r) {
		var e = [];
		return t = x(t, r), m.each(n, function(n, r, u) {
			t(n, r, u) && e.push(n)
		}), e
	}, m.reject = function(n, t, r) {
		return m.filter(n, m.negate(x(t)), r)
	}, m.every = m.all = function(n, t, r) {
		t = x(t, r);
		for(var e = !k(n) && m.keys(n), u = (e || n).length, i = 0; u > i; i++) {
			var o = e ? e[i] : i;
			if(!t(n[o], o, n)) return !1
		}
		return !0
	}, m.some = m.any = function(n, t, r) {
		t = x(t, r);
		for(var e = !k(n) && m.keys(n), u = (e || n).length, i = 0; u > i; i++) {
			var o = e ? e[i] : i;
			if(t(n[o], o, n)) return !0
		}
		return !1
	}, m.contains = m.includes = m.include = function(n, t, r, e) {
		return k(n) || (n = m.values(n)), ("number" != typeof r || e) && (r = 0), m.indexOf(n, t, r) >= 0
	}, m.invoke = function(n, t) {
		var r = l.call(arguments, 2),
			e = m.isFunction(t);
		return m.map(n, function(n) {
			var u = e ? t : n[t];
			return null == u ? u : u.apply(n, r)
		})
	}, m.pluck = function(n, t) {
		return m.map(n, m.property(t))
	}, m.where = function(n, t) {
		return m.filter(n, m.matcher(t))
	}, m.findWhere = function(n, t) {
		return m.find(n, m.matcher(t))
	}, m.max = function(n, t, r) {
		var e, u, i = -1 / 0,
			o = -1 / 0;
		if(null == t && null != n) {
			n = k(n) ? n : m.values(n);
			for(var a = 0, c = n.length; c > a; a++) e = n[a], e > i && (i = e)
		} else t = x(t, r), m.each(n, function(n, r, e) {
			u = t(n, r, e), (u > o || u === -1 / 0 && i === -1 / 0) && (i = n, o = u)
		});
		return i
	}, m.min = function(n, t, r) {
		var e, u, i = 1 / 0,
			o = 1 / 0;
		if(null == t && null != n) {
			n = k(n) ? n : m.values(n);
			for(var a = 0, c = n.length; c > a; a++) e = n[a], i > e && (i = e)
		} else t = x(t, r), m.each(n, function(n, r, e) {
			u = t(n, r, e), (o > u || 1 / 0 === u && 1 / 0 === i) && (i = n, o = u)
		});
		return i
	}, m.shuffle = function(n) {
		for(var t, r = k(n) ? n : m.values(n), e = r.length, u = Array(e), i = 0; e > i; i++) t = m.random(0, i), t !== i && (u[i] = u[t]), u[t] = r[i];
		return u
	}, m.sample = function(n, t, r) {
		return null == t || r ? (k(n) || (n = m.values(n)), n[m.random(n.length - 1)]) : m.shuffle(n).slice(0, Math.max(0, t))
	}, m.sortBy = function(n, t, r) {
		return t = x(t, r), m.pluck(m.map(n, function(n, r, e) {
			return {
				value: n,
				index: r,
				criteria: t(n, r, e)
			}
		}).sort(function(n, t) {
			var r = n.criteria,
				e = t.criteria;
			if(r !== e) {
				if(r > e || r === void 0) return 1;
				if(e > r || e === void 0) return -1
			}
			return n.index - t.index
		}), "value")
	};
	var F = function(n) {
		return function(t, r, e) {
			var u = {};
			return r = x(r, e), m.each(t, function(e, i) {
				var o = r(e, i, t);
				n(u, e, o)
			}), u
		}
	};
	m.groupBy = F(function(n, t, r) {
		m.has(n, r) ? n[r].push(t) : n[r] = [t]
	}), m.indexBy = F(function(n, t, r) {
		n[r] = t
	}), m.countBy = F(function(n, t, r) {
		m.has(n, r) ? n[r]++ : n[r] = 1
	}), m.toArray = function(n) {
		return n ? m.isArray(n) ? l.call(n) : k(n) ? m.map(n, m.identity) : m.values(n) : []
	}, m.size = function(n) {
		return null == n ? 0 : k(n) ? n.length : m.keys(n).length
	}, m.partition = function(n, t, r) {
		t = x(t, r);
		var e = [],
			u = [];
		return m.each(n, function(n, r, i) {
			(t(n, r, i) ? e : u).push(n)
		}), [e, u]
	}, m.first = m.head = m.take = function(n, t, r) {
		return null == n ? void 0 : null == t || r ? n[0] : m.initial(n, n.length - t)
	}, m.initial = function(n, t, r) {
		return l.call(n, 0, Math.max(0, n.length - (null == t || r ? 1 : t)))
	}, m.last = function(n, t, r) {
		return null == n ? void 0 : null == t || r ? n[n.length - 1] : m.rest(n, Math.max(0, n.length - t))
	}, m.rest = m.tail = m.drop = function(n, t, r) {
		return l.call(n, null == t || r ? 1 : t)
	}, m.compact = function(n) {
		return m.filter(n, m.identity)
	};
	var S = function(n, t, r, e) {
		for(var u = [], i = 0, o = e || 0, a = O(n); a > o; o++) {
			var c = n[o];
			if(k(c) && (m.isArray(c) || m.isArguments(c))) {
				t || (c = S(c, t, r));
				var f = 0,
					l = c.length;
				for(u.length += l; l > f;) u[i++] = c[f++]
			} else r || (u[i++] = c)
		}
		return u
	};
	m.flatten = function(n, t) {
		return S(n, t, !1)
	}, m.without = function(n) {
		return m.difference(n, l.call(arguments, 1))
	}, m.uniq = m.unique = function(n, t, r, e) {
		m.isBoolean(t) || (e = r, r = t, t = !1), null != r && (r = x(r, e));
		for(var u = [], i = [], o = 0, a = O(n); a > o; o++) {
			var c = n[o],
				f = r ? r(c, o, n) : c;
			t ? (o && i === f || u.push(c), i = f) : r ? m.contains(i, f) || (i.push(f), u.push(c)) : m.contains(u, c) || u.push(c)
		}
		return u
	}, m.union = function() {
		return m.uniq(S(arguments, !0, !0))
	}, m.intersection = function(n) {
		for(var t = [], r = arguments.length, e = 0, u = O(n); u > e; e++) {
			var i = n[e];
			if(!m.contains(t, i)) {
				for(var o = 1; r > o && m.contains(arguments[o], i); o++);
				o === r && t.push(i)
			}
		}
		return t
	}, m.difference = function(n) {
		var t = S(arguments, !0, !0, 1);
		return m.filter(n, function(n) {
			return !m.contains(t, n)
		})
	}, m.zip = function() {
		return m.unzip(arguments)
	}, m.unzip = function(n) {
		for(var t = n && m.max(n, O).length || 0, r = Array(t), e = 0; t > e; e++) r[e] = m.pluck(n, e);
		return r
	}, m.object = function(n, t) {
		for(var r = {}, e = 0, u = O(n); u > e; e++) t ? r[n[e]] = t[e] : r[n[e][0]] = n[e][1];
		return r
	}, m.findIndex = t(1), m.findLastIndex = t(-1), m.sortedIndex = function(n, t, r, e) {
		r = x(r, e, 1);
		for(var u = r(t), i = 0, o = O(n); o > i;) {
			var a = Math.floor((i + o) / 2);
			r(n[a]) < u ? i = a + 1 : o = a
		}
		return i
	}, m.indexOf = r(1, m.findIndex, m.sortedIndex), m.lastIndexOf = r(-1, m.findLastIndex), m.range = function(n, t, r) {
		null == t && (t = n || 0, n = 0), r = r || 1;
		for(var e = Math.max(Math.ceil((t - n) / r), 0), u = Array(e), i = 0; e > i; i++, n += r) u[i] = n;
		return u
	};
	var E = function(n, t, r, e, u) {
		if(!(e instanceof t)) return n.apply(r, u);
		var i = j(n.prototype),
			o = n.apply(i, u);
		return m.isObject(o) ? o : i
	};
	m.bind = function(n, t) {
		if(g && n.bind === g) return g.apply(n, l.call(arguments, 1));
		if(!m.isFunction(n)) throw new TypeError("Bind must be called on a function");
		var r = l.call(arguments, 2),
			e = function() {
				return E(n, e, t, this, r.concat(l.call(arguments)))
			};
		return e
	}, m.partial = function(n) {
		var t = l.call(arguments, 1),
			r = function() {
				for(var e = 0, u = t.length, i = Array(u), o = 0; u > o; o++) i[o] = t[o] === m ? arguments[e++] : t[o];
				for(; e < arguments.length;) i.push(arguments[e++]);
				return E(n, r, this, this, i)
			};
		return r
	}, m.bindAll = function(n) {
		var t, r, e = arguments.length;
		if(1 >= e) throw new Error("bindAll must be passed function names");
		for(t = 1; e > t; t++) r = arguments[t], n[r] = m.bind(n[r], n);
		return n
	}, m.memoize = function(n, t) {
		var r = function(e) {
			var u = r.cache,
				i = "" + (t ? t.apply(this, arguments) : e);
			return m.has(u, i) || (u[i] = n.apply(this, arguments)), u[i]
		};
		return r.cache = {}, r
	}, m.delay = function(n, t) {
		var r = l.call(arguments, 2);
		return setTimeout(function() {
			return n.apply(null, r)
		}, t)
	}, m.defer = m.partial(m.delay, m, 1), m.throttle = function(n, t, r) {
		var e, u, i, o = null,
			a = 0;
		r || (r = {});
		var c = function() {
			a = r.leading === !1 ? 0 : m.now(), o = null, i = n.apply(e, u), o || (e = u = null)
		};
		return function() {
			var f = m.now();
			a || r.leading !== !1 || (a = f);
			var l = t - (f - a);
			return e = this, u = arguments, 0 >= l || l > t ? (o && (clearTimeout(o), o = null), a = f, i = n.apply(e, u), o || (e = u = null)) : o || r.trailing === !1 || (o = setTimeout(c, l)), i
		}
	}, m.debounce = function(n, t, r) {
		var e, u, i, o, a, c = function() {
			var f = m.now() - o;
			t > f && f >= 0 ? e = setTimeout(c, t - f) : (e = null, r || (a = n.apply(i, u), e || (i = u = null)))
		};
		return function() {
			i = this, u = arguments, o = m.now();
			var f = r && !e;
			return e || (e = setTimeout(c, t)), f && (a = n.apply(i, u), i = u = null), a
		}
	}, m.wrap = function(n, t) {
		return m.partial(t, n)
	}, m.negate = function(n) {
		return function() {
			return !n.apply(this, arguments)
		}
	}, m.compose = function() {
		var n = arguments,
			t = n.length - 1;
		return function() {
			for(var r = t, e = n[t].apply(this, arguments); r--;) e = n[r].call(this, e);
			return e
		}
	}, m.after = function(n, t) {
		return function() {
			return --n < 1 ? t.apply(this, arguments) : void 0
		}
	}, m.before = function(n, t) {
		var r;
		return function() {
			return --n > 0 && (r = t.apply(this, arguments)), 1 >= n && (t = null), r
		}
	}, m.once = m.partial(m.before, 2);
	var M = !{
			toString: null
		}.propertyIsEnumerable("toString"),
		I = ["valueOf", "isPrototypeOf", "toString", "propertyIsEnumerable", "hasOwnProperty", "toLocaleString"];
	m.keys = function(n) {
		if(!m.isObject(n)) return [];
		if(v) return v(n);
		var t = [];
		for(var r in n) m.has(n, r) && t.push(r);
		return M && e(n, t), t
	}, m.allKeys = function(n) {
		if(!m.isObject(n)) return [];
		var t = [];
		for(var r in n) t.push(r);
		return M && e(n, t), t
	}, m.values = function(n) {
		for(var t = m.keys(n), r = t.length, e = Array(r), u = 0; r > u; u++) e[u] = n[t[u]];
		return e
	}, m.mapObject = function(n, t, r) {
		t = x(t, r);
		for(var e, u = m.keys(n), i = u.length, o = {}, a = 0; i > a; a++) e = u[a], o[e] = t(n[e], e, n);
		return o
	}, m.pairs = function(n) {
		for(var t = m.keys(n), r = t.length, e = Array(r), u = 0; r > u; u++) e[u] = [t[u], n[t[u]]];
		return e
	}, m.invert = function(n) {
		for(var t = {}, r = m.keys(n), e = 0, u = r.length; u > e; e++) t[n[r[e]]] = r[e];
		return t
	}, m.functions = m.methods = function(n) {
		var t = [];
		for(var r in n) m.isFunction(n[r]) && t.push(r);
		return t.sort()
	}, m.extend = _(m.allKeys), m.extendOwn = m.assign = _(m.keys), m.findKey = function(n, t, r) {
		t = x(t, r);
		for(var e, u = m.keys(n), i = 0, o = u.length; o > i; i++)
			if(e = u[i], t(n[e], e, n)) return e
	}, m.pick = function(n, t, r) {
		var e, u, i = {},
			o = n;
		if(null == o) return i;
		m.isFunction(t) ? (u = m.allKeys(o), e = b(t, r)) : (u = S(arguments, !1, !1, 1), e = function(n, t, r) {
			return t in r
		}, o = Object(o));
		for(var a = 0, c = u.length; c > a; a++) {
			var f = u[a],
				l = o[f];
			e(l, f, o) && (i[f] = l)
		}
		return i
	}, m.omit = function(n, t, r) {
		if(m.isFunction(t)) t = m.negate(t);
		else {
			var e = m.map(S(arguments, !1, !1, 1), String);
			t = function(n, t) {
				return !m.contains(e, t)
			}
		}
		return m.pick(n, t, r)
	}, m.defaults = _(m.allKeys, !0), m.create = function(n, t) {
		var r = j(n);
		return t && m.extendOwn(r, t), r
	}, m.clone = function(n) {
		return m.isObject(n) ? m.isArray(n) ? n.slice() : m.extend({}, n) : n
	}, m.tap = function(n, t) {
		return t(n), n
	}, m.isMatch = function(n, t) {
		var r = m.keys(t),
			e = r.length;
		if(null == n) return !e;
		for(var u = Object(n), i = 0; e > i; i++) {
			var o = r[i];
			if(t[o] !== u[o] || !(o in u)) return !1
		}
		return !0
	};
	var N = function(n, t, r, e) {
		if(n === t) return 0 !== n || 1 / n === 1 / t;
		if(null == n || null == t) return n === t;
		n instanceof m && (n = n._wrapped), t instanceof m && (t = t._wrapped);
		var u = s.call(n);
		if(u !== s.call(t)) return !1;
		switch(u) {
			case "[object RegExp]":
			case "[object String]":
				return "" + n == "" + t;
			case "[object Number]":
				return +n !== +n ? +t !== +t : 0 === +n ? 1 / +n === 1 / t : +n === +t;
			case "[object Date]":
			case "[object Boolean]":
				return +n === +t
		}
		var i = "[object Array]" === u;
		if(!i) {
			if("object" != typeof n || "object" != typeof t) return !1;
			var o = n.constructor,
				a = t.constructor;
			if(o !== a && !(m.isFunction(o) && o instanceof o && m.isFunction(a) && a instanceof a) && "constructor" in n && "constructor" in t) return !1
		}
		r = r || [], e = e || [];
		for(var c = r.length; c--;)
			if(r[c] === n) return e[c] === t;
		if(r.push(n), e.push(t), i) {
			if(c = n.length, c !== t.length) return !1;
			for(; c--;)
				if(!N(n[c], t[c], r, e)) return !1
		} else {
			var f, l = m.keys(n);
			if(c = l.length, m.keys(t).length !== c) return !1;
			for(; c--;)
				if(f = l[c], !m.has(t, f) || !N(n[f], t[f], r, e)) return !1
		}
		return r.pop(), e.pop(), !0
	};
	m.isEqual = function(n, t) {
		return N(n, t)
	}, m.isEmpty = function(n) {
		return null == n ? !0 : k(n) && (m.isArray(n) || m.isString(n) || m.isArguments(n)) ? 0 === n.length : 0 === m.keys(n).length
	}, m.isElement = function(n) {
		return !(!n || 1 !== n.nodeType)
	}, m.isArray = h || function(n) {
		return "[object Array]" === s.call(n)
	}, m.isObject = function(n) {
		var t = typeof n;
		return "function" === t || "object" === t && !!n
	}, m.each(["Arguments", "Function", "String", "Number", "Date", "RegExp", "Error"], function(n) {
		m["is" + n] = function(t) {
			return s.call(t) === "[object " + n + "]"
		}
	}), m.isArguments(arguments) || (m.isArguments = function(n) {
		return m.has(n, "callee")
	}), "function" != typeof /./ && "object" != typeof Int8Array && (m.isFunction = function(n) {
		return "function" == typeof n || !1
	}), m.isFinite = function(n) {
		return isFinite(n) && !isNaN(parseFloat(n))
	}, m.isNaN = function(n) {
		return m.isNumber(n) && n !== +n
	}, m.isBoolean = function(n) {
		return n === !0 || n === !1 || "[object Boolean]" === s.call(n)
	}, m.isNull = function(n) {
		return null === n
	}, m.isUndefined = function(n) {
		return n === void 0
	}, m.has = function(n, t) {
		return null != n && p.call(n, t)
	}, m.noConflict = function() {
		return u._ = i, this
	}, m.identity = function(n) {
		return n
	}, m.constant = function(n) {
		return function() {
			return n
		}
	}, m.noop = function() {}, m.property = w, m.propertyOf = function(n) {
		return null == n ? function() {} : function(t) {
			return n[t]
		}
	}, m.matcher = m.matches = function(n) {
		return n = m.extendOwn({}, n),
			function(t) {
				return m.isMatch(t, n)
			}
	}, m.times = function(n, t, r) {
		var e = Array(Math.max(0, n));
		t = b(t, r, 1);
		for(var u = 0; n > u; u++) e[u] = t(u);
		return e
	}, m.random = function(n, t) {
		return null == t && (t = n, n = 0), n + Math.floor(Math.random() * (t - n + 1))
	}, m.now = Date.now || function() {
		return(new Date).getTime()
	};
	var B = {
			"&": "&amp;",
			"<": "&lt;",
			">": "&gt;",
			'"': "&quot;",
			"'": "&#x27;",
			"`": "&#x60;"
		},
		T = m.invert(B),
		R = function(n) {
			var t = function(t) {
					return n[t]
				},
				r = "(?:" + m.keys(n).join("|") + ")",
				e = RegExp(r),
				u = RegExp(r, "g");
			return function(n) {
				return n = null == n ? "" : "" + n, e.test(n) ? n.replace(u, t) : n
			}
		};
	m.escape = R(B), m.unescape = R(T), m.result = function(n, t, r) {
		var e = null == n ? void 0 : n[t];
		return e === void 0 && (e = r), m.isFunction(e) ? e.call(n) : e
	};
	var q = 0;
	m.uniqueId = function(n) {
		var t = ++q + "";
		return n ? n + t : t
	}, m.templateSettings = {
		evaluate: /<%([\s\S]+?)%>/g,
		interpolate: /<%=([\s\S]+?)%>/g,
		escape: /<%-([\s\S]+?)%>/g
	};
	var K = /(.)^/,
		z = {
			"'": "'",
			"\\": "\\",
			"\r": "r",
			"\n": "n",
			"\u2028": "u2028",
			"\u2029": "u2029"
		},
		D = /\\|'|\r|\n|\u2028|\u2029/g,
		L = function(n) {
			return "\\" + z[n]
		};
	m.template = function(n, t, r) {
		!t && r && (t = r), t = m.defaults({}, t, m.templateSettings);
		var e = RegExp([(t.escape || K).source, (t.interpolate || K).source, (t.evaluate || K).source].join("|") + "|$", "g"),
			u = 0,
			i = "__p+='";
		n.replace(e, function(t, r, e, o, a) {
			return i += n.slice(u, a).replace(D, L), u = a + t.length, r ? i += "'+\n((__t=(" + r + "))==null?'':_.escape(__t))+\n'" : e ? i += "'+\n((__t=(" + e + "))==null?'':__t)+\n'" : o && (i += "';\n" + o + "\n__p+='"), t
		}), i += "';\n", t.variable || (i = "with(obj||{}){\n" + i + "}\n"), i = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + i + "return __p;\n";
		try {
			var o = new Function(t.variable || "obj", "_", i)
		} catch(a) {
			throw a.source = i, a
		}
		var c = function(n) {
				return o.call(this, n, m)
			},
			f = t.variable || "obj";
		return c.source = "function(" + f + "){\n" + i + "}", c
	}, m.chain = function(n) {
		var t = m(n);
		return t._chain = !0, t
	};
	var P = function(n, t) {
		return n._chain ? m(t).chain() : t
	};
	m.mixin = function(n) {
		m.each(m.functions(n), function(t) {
			var r = m[t] = n[t];
			m.prototype[t] = function() {
				var n = [this._wrapped];
				return f.apply(n, arguments), P(this, r.apply(m, n))
			}
		})
	}, m.mixin(m), m.each(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function(n) {
		var t = o[n];
		m.prototype[n] = function() {
			var r = this._wrapped;
			return t.apply(r, arguments), "shift" !== n && "splice" !== n || 0 !== r.length || delete r[0], P(this, r)
		}
	}), m.each(["concat", "join", "slice"], function(n) {
		var t = o[n];
		m.prototype[n] = function() {
			return P(this, t.apply(this._wrapped, arguments))
		}
	}), m.prototype.value = function() {
		return this._wrapped
	}, m.prototype.valueOf = m.prototype.toJSON = m.prototype.value, m.prototype.toString = function() {
		return "" + this._wrapped
	}, "function" == typeof define && define.amd && define("underscore", [], function() {
		return m
	})
}).call(this);



const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

canvas.width = 1000;
canvas.height = 600;
canvas.style.background = '#000';

class Ball {
  constructor(x, y, color) {
    this.x = x;
    this.y = y;
    this.color = color;
    this.r = 40;
  }
  render() {
    ctx.save();
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
    ctx.fillStyle = this.color;
    ctx.fill();
    ctx.restore();
  }
}

//移动类
class MoveBall extends Ball {
  constructor(x, y, color) {
    super(x, y, color);

    this.dX = _.random( - 5, 5);
    this.dY = _.random( - 5, 5);
    this.dR = _.random(1, 3)
  }
  update() {
    this.x += this.dX;
    this.y += this.dY;
    this.r -= this.dR;
    if (this.r < 0) {
      this.r = 0;
    }

  }
}

let ballArr = [];
let colorArr = ['red', 'green', 'blue', 'yellow', 'purple', 'pink', 'orange'];

canvas.addEventListener('mousemove', function(e) {

  ballArr.push(new MoveBall(e.offsetX, e.offsetY, colorArr[_.random(0, colorArr.length - 1)]));

});

setInterval(function() {
  ctx.clearRect(0, 0, canvas.width, canvas.height)

  for (let i = 0; i < ballArr.length; i++) {
    ballArr[i].render();
    ballArr[i].update();
  }
},
50)
<canvas id="canvas">
  当前浏览器不支持canvas
</canvas>
body {
  margin: 150px;
}

#canvas {
  box-shadow: 0 0 10px #000;
}