您的位置:首页 > Web前端 > JavaScript

JavaScript的表达式解析器-6. 函数的实现

2013-01-14 15:27 323 查看
类似于操作符,函数的实现也很简单,以Average函数为例:

var igame;

importNamespace( 'igame.Expression.Operator.Function' );

igame.Expression.Operator.Function.Average = function ()
{
	igame.Expression.Operator.FunctionBase.call( this );

	this.setMinArgumentLength( 1 );
	this.setMaxArgumentLength( 65535 );
	this.setName( '***ERAGE' );
}

with ( igame.Expression )
{
	with ( Operator )
	{
		with ( Function )
		{
			ClassDerive( Average, 'Average', FunctionBase );

			Average.prototype.evaluate = function ( operands )
			{
				FunctionBase.prototype.evaluate.call( this, operands );

				var res = 0;
				var len = operands.length;

				while ( operands.length )
				{
					var op = operands.pop();

					if ( !( op instanceof Operand.Number || op instanceof Operand.Boolean ) )
						throw new Error( 'Unsupported type' );

					res += op.getValue();
				}

				return new Operand.Number( res / len );
			}
		} // with Function
	} // with Operator
} // with namespace


因为没有实现自动注册功能,所以还需要在Function.js中做一些工作:

var igame;

importNamespace( 'igame.Expression.Operator' );

igame.Expression.Operator.Function = {
	'createFunction': function ( funcName )
	{
		switch ( funcName.toLowerCase() )
		{
			case 'sum': return new igame.Expression.Operator.Function.Sum();
			case 'average': return new igame.Expression.Operator.Function.Average();
			case 'power': return new igame.Expression.Operator.Function.Power();
			default: throw new Error( 'Function \'' + funcName + '\' is not defined' );
		}
	}

};


添加函数的工作变得简单了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: