设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 1687|回复: 5

[原创] javascript中实现override,overload和类似c#中的property [复制链接]

Rank: 2

升级  10%

注册时间
2004-10-23
威望
41
阅读权限
20
积分
65
帖子
21
精华
0
UID
18544
状态
当前离线
发表于 2008-5-15 16:57:22 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
一键分享 一键分享
先把这个script加到你的页面里:
http://code.google.com/p/doufu/source/browse/trunk/nsc.js

实现一个基础类和继承类:

  1. <html>
  2. <head></head>
  3. <body>

  4. <script src="http://doufu.googlecode.com/svn/trunk/nsc.js">
  5. </script>
  6. <script>

  7. window.onload = function()
  8. {


  9. BaseClassA = function()
  10. {
  11.         nsc.OOP.Class(this);
  12.         this.SayHello = function()
  13.         {
  14.                 return "Hello world!";
  15.         }
  16. }
  17. DerivedFromA = function()
  18. {
  19.         nsc.OOP.Class(this);
  20.         this.Inherit(BaseClassA);
  21. }

  22. ba = new BaseClassA();
  23. da = new DerivedFromA();

  24. alert(ba.SayHello());
  25. alert(da.SayHello());
  26. alert(da.InstanceOf(BaseClassA));

  27. }
  28. </script>
复制代码运行代码另存代码


在上面的类中,我们可以用this.OverrideMethod实现类似Override的功能, 例子
  1. <script src="http://doufu.googlecode.com/svn/trunk/nsc.js">
  2. </script>
  3. <script>


  4. window.onload = function()
  5. {


  6. BaseClassA = function()
  7. {
  8.         nsc.OOP.Class(this);
  9.         this.SayHello = function()
  10.         {
  11.                 return "Hello world!";
  12.         }
  13.         this.InvokeSay = function()
  14.         {
  15.                 alert(this.SayHello());
  16.         }
  17. }
  18. DerivedFromA = function()
  19. {
  20.         nsc.OOP.Class(this);
  21.         this.Inherit(BaseClassA);
  22.         this.OverrideMethod("SayHello",
  23.                 function()
  24.                 {
  25.                         return "Overrided " + this._base_SayHello();
  26.                 }
  27.         );
  28. }

  29. ba = new BaseClassA();
  30. da = new DerivedFromA();

  31. ba.InvokeSay();
  32. da.InvokeSay();


  33. }
  34. </script>
复制代码运行代码另存代码


用This.NewProperty实现类似Property 的功能

  1. BaseClassA = function()
  2. {
  3.         nsc.OOP.Class(this);

  4.         // Create Properties
  5.         var _noun = "world";
  6.         this.NewProperty("Noun");
  7.         this.Noun.Get = function()
  8.         {
  9.                 return _noun;
  10.         }
  11.         this.Noun.Set = function(value)
  12.         {
  13.                 _noun = value;
  14.         }
  15.        
  16.         var _count = 0;
  17.         this.NewProperty("Count");
  18.         this.Count.Get = function()
  19.         {
  20.                 return _count;
  21.         }
  22.         this.Count.Set = function(value)
  23.         {
  24.                 _count = value;
  25.         }
  26. }
复制代码运行代码另存代码


并且在一些特殊情况下,允许直接使用 this.属性名 来取得get方法的返回值:

  1. <script src="http://doufu.googlecode.com/svn/trunk/nsc.js">
  2. </script>
  3. <script>

  4. window.onload = function()
  5. {

  6. BaseClassA = function()
  7. {
  8.         nsc.OOP.Class(this);
  9.         this.SayHello = function()
  10.         {
  11.                 // Explicitly assign property value and implicitly get property value
  12.                 this.Count(this.Count + 1);
  13.                 // Implicitly convert property to string
  14.                 return "Hello " + this.Noun + "! " + this.Count;
  15.         }
  16.         this.InvokeSay = function()
  17.         {
  18.                 alert(this.SayHello());
  19.         }
  20.        
  21.         // Create Properties
  22.         var _noun = "world";
  23.         this.NewProperty("Noun");
  24.         this.Noun.Get = function()
  25.         {
  26.                 return _noun;
  27.         }
  28.         this.Noun.Set = function(value)
  29.         {
  30.                 _noun = value;
  31.         }
  32.        
  33.         var _count = 0;
  34.         this.NewProperty("Count");
  35.         this.Count.Get = function()
  36.         {
  37.                 return _count;
  38.         }
  39.         this.Count.Set = function(value)
  40.         {
  41.                 _count = value;
  42.         }
  43. }
  44. DerivedFromA = function()
  45. {
  46.         nsc.OOP.Class(this);
  47.         this.Inherit(BaseClassA);
  48.         this.OverrideMethod("SayHello",
  49.                 function()
  50.                 {
  51.                         return "Overrided " + this._base_SayHello();
  52.                 }
  53.         );
  54. }

  55. ba = new BaseClassA();
  56. da = new DerivedFromA();

  57. ba.InvokeSay();
  58. da.InvokeSay();
  59. // Explicitly assign value
  60. da.Count(10)
  61. da.InvokeSay();

  62. }

  63. </script>
复制代码运行代码另存代码


用this.OverloadMethod实现overload:

this.OverloadMethod("方法名", function()
{
  //coding here
});

overload method 的sample代码等等写

[ 本帖最后由 normanzb 于 2008-5-15 17:19 编辑 ]

Rank: 2

升级  10%

注册时间
2004-10-23
威望
41
阅读权限
20
积分
65
帖子
21
精华
0
UID
18544
状态
当前离线
发表于 2008-5-15 17:04:13 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
貌似乎在论坛里直接点运行不行?

存到本地可以

Update: 可以直接点开运行了

[ 本帖最后由 normanzb 于 2008-5-15 17:20 编辑 ]

使用道具 举报

超级版主

5毛发一贴,千里不留行。

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2008-5-15 23:43:57 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
其实呢 我觉得 不要做一些很奇怪的事情
  1. <html>
  2. <head></head>
  3. <body>
  4. <script>

  5. window.onload = function()
  6. {


  7. BaseClassA = function()
  8. {
  9.         this.SayHello = function()
  10.         {
  11.                 return "Hello world!";
  12.         }
  13. }
  14. DerivedFromA = function()
  15. {
  16.         BaseClassA.call(this);
  17. }

  18. ba = new BaseClassA();
  19. da = new DerivedFromA();

  20. alert(ba.SayHello());
  21. alert(da.SayHello());
  22. //这个InstanceOf其实没什么用吧
  23. //alert(da.InstanceOf(BaseClassA));

  24. }
  25. </script>
复制代码运行代码另存代码



  1. <script>


  2. window.onload = function()
  3. {


  4. BaseClassA = function()
  5. {
  6.         this.SayHello = function()
  7.         {
  8.                 return "Hello world!";
  9.         }
  10.         this.InvokeSay = function()
  11.         {
  12.                 alert(this.SayHello());
  13.         }
  14. }
  15. DerivedFromA = function()
  16. {
  17.         BaseClassA.call(this);
  18.         _base_SayHello=this.SayHello;
  19.         this["SayHello"]=function()
  20.         {
  21.                 return "Overrided " + _base_SayHello.apply(this,arguments);
  22.         }

  23. }

  24. ba = new BaseClassA();
  25. da = new DerivedFromA();

  26. ba.InvokeSay();
  27. da.InvokeSay();


  28. }
  29. </script>
复制代码运行代码另存代码



第三个的话
显然get是在valueOf 而set是无效的
这个封装成这样不是很好 很容易让人误会 如果是ff的话 有原生的__defineSetter__和__defineGetter__ IE就不行了

[ 本帖最后由 winter 于 2008-5-15 23:46 编辑 ]

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2008-5-16 07:18:30 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
function A()
{
    this.SayHello = function(){alert("Hello World")}
}
继承这样就能实现:
function B(){}
B.prototype = new A;
(new B).SayHello();

重写这样也能实现:
function B(){
    this.SayHello = function(){alert("Override Hello World")}
}
B.prototype = new A;
(new B).SayHello();

至于属性构造器,目前的js还不能完美的实现。
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

Rank: 2

升级  10%

注册时间
2004-10-23
威望
41
阅读权限
20
积分
65
帖子
21
精华
0
UID
18544
状态
当前离线
发表于 2008-5-16 10:02:17 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 Rimifon 于 2008-5-16 07:18 发表
function A()
{
    this.SayHello = function(){alert("Hello World")}
}
继承这样就能实现:
function B(){}
B.prototype = new A;
(new B).SayHello();

重写这样也能实现:
function B(){
    th ...



关键是用PROTOTYPE时,原型里面用var 声明的变量会被其他实例共享...所以为了解决这个问题用了上面的方法.

另外用以上方法的另外一个好处是,你可以通过_base_methodname调用基类中的方法,

[ 本帖最后由 normanzb 于 2008-5-16 10:12 编辑 ]

使用道具 举报

Rank: 2

升级  10%

注册时间
2004-10-23
威望
41
阅读权限
20
积分
65
帖子
21
精华
0
UID
18544
状态
当前离线
发表于 2008-5-16 10:04:58 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 winter 于 2008-5-15 23:43 发表
其实呢 我觉得 不要做一些很奇怪的事情






window.onload = function()
{


BaseClassA = function()
{
        this.SayHello = function()
        {
                return "Hello world!";
        }
}
DerivedFromA = f ...



1. 有道理,确实有时候会弄混,主要是为了能够像C#中一样能够控制属性值设置和输出.

其实为了不导致混淆,最好的取/读值写法应该 this.属性名()/this.属性名(新值)  这样就不会弄混了.

2. InstanceOf其实是用来看实例是否从指定的类或者其继承自的类中实力化来的.

[ 本帖最后由 normanzb 于 2008-5-16 10:11 编辑 ]

[[I] 本帖最后由 normanzb 于 2008-7-11 11:06 编辑 [/I]]

使用道具 举报

您需要登录后才可以回帖 登录 | 加入无忧

Archiver|手机版|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445  

GMT+8, 2012-2-7 21:27 , Processed in 0.052129 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部