/textarea>br> br> 调试信息:br> textarea rows = "10" cols = "100" id = "debug">/textarea>br> script language="javascript"> /* 特性(Attributes)是一种崭新的声" />
网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 核心技术 > 网络编程 > 用javascript模拟C#的[Attribute]用法  

用javascript模拟C#的[Attribute]用法

2005-10-24  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  <!--用Js模拟C#的Attribute-->
  执行结果:<br>
  <textarea rows = "10" cols = "100" id = "output"></textarea><br>
  <br>
  调试信息:<br>
  <textarea rows = "10" cols = "100" id = "debug"></textarea><br>
  
  <script language="javascript">
  /* 特性(Attributes)是一种崭新的声明性信息。
  我们不仅可以通过特性来定义设计层面的信息
  (例如help file, URL for documentation)
  以及运行时(run-time)信息(例如使XML与class相联系),
  而且我们还可以利用特性建立自描述(self-describing)组件。
  */
  
  function Attribute() //Attribute 基类,可以自行定义其中的接口以扩充功能,这里只是一个简单的演示,因此留空
  {
  
  }
  
  function TestMethod() //定义一个新的Attribute类 TestMethod,用它来给需要进行单元测试的方法提供额外信息
  {
  this.name = "TestMethod";
  }TestMethod.prototype = new Attribute();
  function TestMethodAttribute() //必需的执行方法
  {
  return new TestMethod();
网管论坛bbs_bitsCN_com

  }
  
  function DebugOutput(bOutput) //定义一个新的Attribute类 DebugOutput,用它来指示是否在测试中输出额外的调试信息
  {
  this.name = "DebugOutput";
  this.isAllowDebugOutput = bOutput;
  }DebugOutput.prototype = new Attribute();
  function DebugOutputAttribute(bOutput) //必需的执行方法
  {
  return new DebugOutput(bOutput);
  }
  
  Function.__captureAttributes = function(obj)
  {
  var attributeDef = /\[\w+\].*\n.*(?=\=[\s]*function)/g;
  var matches = obj.constructor.toString().match(attributeDef);
  if(matches != null)
  {
  for (var i = 0; i < matches.length; i++)
  {
  var part = matches[i].split(/[\s\n]/);
  var attrLists = part[0].split(",");
  var methodObj = eval(part[part.length-1]);
  methodObj.__attributes = new Array();
  methodObj.__attributes.__all = new Array();
  
  for (var j = 0; j < attrLists.length; j++)
  {
  if(!/^.+\(.*\)$/.test(attrLists[j].slice(1,-1))) 中国网管联盟bitsCN.com
  {
  attrLists[j] = "[" + attrLists[j].slice(1,-1) + "()" + "]"; //处理省略括号的情况
  }
  if(!/^.+Attribute$/.test(attrLists[j].split("(")[0]))
  {
  attrLists[j] = attrLists[j].split("(")[0] + "Attribute" + "(" + attrLists[j].split("(")[1];
  }
  
  var attrObj = eval(eval(attrLists[j])[0]);
  methodObj.__attributes.__all.push(attrObj);
  methodObj.__attributes[attrLists[j].split("(")[0].replace(/[\[\]]/g,"").replace(/Attribute$/g,"")] = attrObj;
  methodObj.__attributes[attrLists[j].split("(")[0].replace(/[\[\]]/g,"")] = attrObj;
  }
  }
  }
  }
  
  function UnitTest() //单元测试框架,被赋予[TestMethod]特性的方法会被作为Case执行测试
  {
  this.errors = 0;
  this.passed = 0;
  //声明TestMethod特性,testString方法将被runCase方法执行,同时声明了DebugOutput特性,将返回的信息输出到调试窗口
  //特性的声明必须放在被指定特性的方法之前,而且要独占一行,如果有多个特性可以以逗号分隔
  //包含特性声明的函数要以";"结尾,不可省略 网管下载dl.bitscn.com
  [TestMethod],[DebugOutput(true)]
  UnitTest.prototype.testString = function() //测试字符串方法,这里假设自己实现了一个String类然后来测试
  {
  var testCase = new String();
  testCase = "abc";
  this.Test(testCase == "abc"); //测试赋值操作
  testCase += "def";
  this.Test(testCase == "abcdef"); //测试连接操作
  this.Test(testCase.length == 6); //测试长度属性
  
  self.output.value += "\n";
  var result = "Debug - testString finished with " + this.passed + " cases passed and " + this.errors + " cases failed!\n";
  this.passed = 0;
  this.errors = 0;
  return result;
  };
  //只测试不输出调试信息的方法
  [TestMethod]
  UnitTest.prototype.testRegexp = function()
  {
  var errors = 0;
  var passed = 0;
  if(/abc/.test("abc"))
  {
  self.output.value += ".";
  passed ++;
  }
  else
  {
  self.output.value += "e";
  errors ++;
  }
  if(/abc/.test("aababcd"))
网管下载dl.bitscn.com

  {
  self.output.value += ".";
  passed ++;
  }
  };
  
  //不被测试的方法
  UnitTest.prototype.foo = function()
  {
  alert('foo not being tested!');
  };
  UnitTest.prototype.runCases = function()
  {
  for (each in this)
  {
  if(this[each].__attributes != null && this[each].__attributes["DebugOutput"] != null)
  {
  var result = this[each].call(this);
  if(this[each].__attributes["DebugOutput"].isAllowDebugOutput)
  {
  self.debug.value = result;
  }
  }
  else if(this[each].__attributes != null && this[each].__attributes["TestMethod"] != null)
  {
  this[each].call(this);
  }
  }
  };
  UnitTest.prototype.Test = function(cond)
  {
  if(cond)
  {
  self.output.value += ".";
  this.passed ++;
  }
  else
  {
  self.output.value += ".";
  this.errors ++;
  }
  };
  //在类内部捕获Attribute对象,必须在使用特性的对象内部声明,这一点同C#还是有区别的 网管u家u.bitsCN.com
  Function.__captureAttributes(this);
  }
  
  var test = new UnitTest();
  test.runCases();
  //或许一些人不太习惯上面的这种做法,但是它有一个显而易见的好处就是我如果希望添加更多的单元测试用例,只需要增加新的标记为[TestMethod]的方法,而不用修改runCases方法的任何代码!这样我就可以将整个单元测试框架“封装起来”而依然允许使用者从“外部”添加自己的测试方法!
  
  //除此以外,我们可以用“特性”相当便利地用来实现许多模式,这方面的具体深入用法这里不再详述了,有兴趣的朋友可以自行尝试^^,不过现在这个模拟的“特性”还有一些不足之处,例如只能将特性声明到对象“方法”而不能声明给对象本身,这样要实现一些像Serializable之类的对象特性就不太方便了=.=
  </script>

TAGs用法   模拟   特性   方法   测试   attrLists   if   声明   信息    
 上一篇:window.open使用方法以及参数说明   下一篇:Javascript所有对象的属性的获取
相关文章列表
用javascript模拟C#的[Attribute]用法 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.window.open使用方法以及参数说明
2.三步学会Java Socket编程
3.用java.nio.*进行网络编程
4.AJAX+jsp无刷新验证码实例
5.使用 Java 编写 B/S 网络通信程序
6.JAVA 的Socket机制
7.简单的ajax+servlet表单数据验证
8.Java Socket编程(一)Socket传输模式
9.用Java制作网络文件下载系统
10.在Java中实现UDP协议编程的方法
最新推荐文章:
1.使用Java进行Web开发的随想
2.Rails 开发与 Java 编程的比较
3.JavaMail发送中文邮件中主题乱码的解决方
4.如何使用Java网络启动部署软件
5.sitemesh的问题及解决
6.Java在C/S网络中的应用
7.用Java制作网络文件下载系统
8.用Java测试网络代码
9.使用Java控制UDP协议
10.Java Socket编程(一)Socket传输模式
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的