UNPKG

olympus-r

Version:

一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:

113 lines (112 loc) 3.63 kB
import { extendObject } from "../../utils/ObjectUtil"; function wrapEvalFunc(exp) { // 这个方法的功能主要是将多个scope合并成为一个scope return function () { var scopes = []; for (var _i = 0; _i < arguments.length; _i++) { scopes[_i] = arguments[_i]; } var scope = extendObject.apply(void 0, [{}].concat(scopes.reverse())); return exp.call(this, scope); }; } /** * 将表达式包装成为方法 * * @param {(EvalExp)} exp 表达式或方法 * @param {number} scopeCount 参数个数,仅在exp为表达式时有效 * @returns {EvalFunc} 包装方法 */ function wrapEvalFuncExp(exp, scopeCount) { if (typeof exp === "string") { var argList = []; var expStr = exp; for (var i = 0; i < scopeCount; i++) { argList.push("s" + i); expStr = "with(s" + i + "||{}){" + expStr + "}"; } return Function(argList.join(","), expStr); } else { return wrapEvalFunc(exp); } } /** * 创建一个执行方法,用于未来执行 * * @export * @param {(EvalExp)} exp 表达式或方法 * @param {number} [scopeCount=0] 所需的域的数量 * @returns {EvalFunc} 创建的方法 */ export function createRunFunc(exp, scopeCount) { if (scopeCount === void 0) { scopeCount = 0; } if (typeof exp === "string") { var func; try { func = wrapEvalFuncExp(exp, scopeCount); } catch (err) { // 可能是某些版本的解释器不认识模板字符串,将模板字符串变成普通字符串 var sepStr = (exp.indexOf('"') < 0 ? '"' : "'"); // 将exp中的·替换为' var reg = /([^\\]?)`/g; exp = exp.replace(reg, "$1" + sepStr); // 将exp中${...}替换为" + ... + "的形式 reg = /\$\{(.*?)\}/g; exp = exp.replace(reg, sepStr + "+($1)+" + sepStr); // 重新生成方法并返回 func = wrapEvalFuncExp(exp, scopeCount); } return func; } else { return wrapEvalFunc(exp); } } /** * 直接执行表达式,不求值。该方法可以执行多条语句 * * @export * @param {(EvalExp)} exp 表达式或方法 * @param {*} [thisArg] this指向 * @param {...any[]} scopes 表达式的作用域列表 */ export function runExp(exp, thisArg) { var scopes = []; for (var _i = 2; _i < arguments.length; _i++) { scopes[_i - 2] = arguments[_i]; } createRunFunc(exp, scopes.length).apply(thisArg, scopes); } /** * 创建一个表达式求值方法,用于未来执行 * * @export * @param {(EvalExp)} exp 表达式或方法 * @param {number} [scopeCount=0] 所需的域的数量 * @returns {EvalFunc} 创建的方法 */ export function createEvalFunc(exp, scopeCount) { if (scopeCount === void 0) { scopeCount = 0; } if (typeof exp === "string") return createRunFunc("return " + exp, scopeCount); else return wrapEvalFunc(exp); } /** * 表达式求值,无法执行多条语句 * * @export * @param {(EvalExp)} exp 表达式或方法 * @param {*} [thisArg] this指向 * @param {...any[]} scopes 表达式的作用域列表 * @returns {*} 返回值 */ export function evalExp(exp, thisArg) { var scopes = []; for (var _i = 2; _i < arguments.length; _i++) { scopes[_i - 2] = arguments[_i]; } return createEvalFunc(exp, scopes.length).apply(thisArg, scopes); }