知识大全 用javascript模拟C#的[Attribute]用法

Posted

篇首语:知识养成了思想,思想同时又在融化知识。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用javascript模拟C#的[Attribute]用法相关的知识,希望对你有一定的参考价值。

用javascript模拟C#的[Attribute]用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  <! 用Js模拟C#的Attribute >  执行结果 <br>  <textarea rows = cols = id = output ></textarea><br>  <br>  调试信息 <br>  <textarea rows = cols = 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();      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 = nstructor toString() match(attributeDef);  if(matches != null)    for (var i = ; i < matches length; i++)    var part = matches[i] split(/[\\s\\n]/);  var attrLists = part[ ] split( );  var methodObj = eval(part[part length ]);  methodObj __attributes = new Array();  methodObj __attributes __all = new Array();    for (var j = ; j < attrLists length; j++)    if(!/^ +\\( *\\)$/ test(attrLists[j] slice( )))    attrLists[j] = [ + attrLists[j] slice( ) + () + ] ; //处理省略括号的情况    if(!/^ +Attribute$/ test(attrLists[j] split( ( )[ ]))    attrLists[j] = attrLists[j] split( ( )[ ] + Attribute + ( + attrLists[j] split( ( )[ ];      var attrObj = eval(eval(attrLists[j])[ ]);  methodObj __attributes __all push(attrObj);  methodObj __attributes[attrLists[j] split( ( )[ ] replace(/[\\[\\]]/g ) replace(/Attribute$/g )] = attrObj;  methodObj __attributes[attrLists[j] split( ( )[ ] replace(/[\\[\\]]/g )] = attrObj;            function UnitTest() //单元测试框架 被赋予[TestMethod]特性的方法会被作为Case执行测试    this errors = ;  this passed = ;  //声明TestMethod特性 testString方法将被runCase方法执行 同时声明了DebugOutput特性 将返回的信息输出到调试窗口  //特性的声明必须放在被指定特性的方法之前 而且要独占一行 如果有多个特性可以以逗号分隔  //包含特性声明的函数要以 ; 结尾 不可省略  [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 == ); //测试长度属性    self output value += \\n ;  var result = Debug testString finished with + this passed + cases passed and + this errors + cases failed!\\n ;  this passed = ;  this errors = ;  return result;  ;  //只测试不输出调试信息的方法  [TestMethod]  UnitTest prototype testRegexp = function()    var errors = ;  var passed = ;  if(/abc/ test( abc ))    self output value += ;  passed ++;    else    self output value += e ;  errors ++;    if(/abc/ test( aababcd ))    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#还是有区别的  Function __captureAttributes(this);      var test = new UnitTest();  test runCases();  //或许一些人不太习惯上面的这种做法 但是它有一个显而易见的好处就是我如果希望添加更多的单元测试用例 只需要增加新的标记为[TestMethod]的方法 而不用修改runCases方法的任何代码!这样我就可以将整个单元测试框架 封装起来 而依然允许使用者从 外部 添加自己的测试方法!    //除此以外 我们可以用 特性 相当便利地用来实现许多模式 这方面的具体深入用法这里不再详述了 有兴趣的朋友可以自行尝试^^ 不过现在这个模拟的 特性 还有一些不足之处 例如只能将特性声明到对象 方法 而不能声明给对象本身 这样要实现一些像Serializable之类的对象特性就不太方便了= =  </script> cha138/Article/program/Java/hx/201311/25602

相关参考

知识大全 用C#或JavaScript扩展XSLT

用C#或JavaScript扩展XSLT  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天在u

知识大全 JavaScript中面向对象技术的模拟

JavaScript中面向对象技术的模拟  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一引言  在

知识大全 C#与javascript简单交互

C#与javascript简单交互  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  呼叫js  R

知识大全 解答关于C#的JavaScript函数的问题

解答关于C#的JavaScript函数的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如何

知识大全 JavaScript 模拟类机制及私有变量的方法及思路

JavaScript模拟类机制及私有变量的方法及思路  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Javascript和C#之间的互相调用和访问

Javascript和C#之间的互相调用和访问  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这

知识大全 JavaScript获取后台C#变量以及调用后台方法

JavaScript获取后台C#变量以及调用后台方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 C#实现遗传算法 模拟花朵的进化

C#实现遗传算法模拟花朵的进化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 以下代码实

知识大全 C#使用双链表来实现模拟IE前进后退功能

C#使用双链表来实现模拟IE前进后退功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简单的测

知识大全 用JavaScript验证密码强度

用JavaScript验证密码强度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  规则如下: