标题: [原创] javascript中实现override,overload和类似c#中的property
normanzb
爬虫
Rank: 2



UID 18544
精华 0
积分 65
帖子 21
威望 41
阅读权限 20
注册 2004-10-23
状态 离线
 
发表于 2008-5-15 16:57  资料  个人空间  短消息  加为好友 
javascript中实现override,overload和类似c#中的property

先把这个script加到你的页面里:
http://code.google.com/p/doufu/source/browse/trunk/nsc.js

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

   提示:您可以先修改部分代码再运行

在上面的类中,我们可以用this.OverrideMethod实现类似Override的功能, 例子

   提示:您可以先修改部分代码再运行

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

   提示:您可以先修改部分代码再运行

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

   提示:您可以先修改部分代码再运行

用this.OverloadMethod实现overload:

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

overload method 的sample代码等等写

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

顶部
normanzb
爬虫
Rank: 2



UID 18544
精华 0
积分 65
帖子 21
威望 41
阅读权限 20
注册 2004-10-23
状态 离线
 
发表于 2008-5-15 17:04  资料  个人空间  短消息  加为好友 
貌似乎在论坛里直接点运行不行?

存到本地可以

Update: 可以直接点开运行了

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

顶部
winter
超级版主
Rank: 8Rank: 8
软虫


UID 65747
精华 11
积分 7139
帖子 3214
威望 3201
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2008-5-15 23:43  资料  个人空间  短消息  加为好友 
其实呢 我觉得 不要做一些很奇怪的事情

   提示:您可以先修改部分代码再运行



   提示:您可以先修改部分代码再运行

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

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





顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5448
帖子 3015
威望 2985
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2008-5-16 07:18  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
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还不能完美的实现。





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
normanzb
爬虫
Rank: 2



UID 18544
精华 0
积分 65
帖子 21
威望 41
阅读权限 20
注册 2004-10-23
状态 离线
 
发表于 2008-5-16 10:02  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]Rimifon[/i] 于 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调用基类中的方法,

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

顶部
normanzb
爬虫
Rank: 2



UID 18544
精华 0
积分 65
帖子 21
威望 41
阅读权限 20
注册 2004-10-23
状态 离线
 
发表于 2008-5-16 10:04  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]winter[/i] 于 2008-5-15 23:43 发表
其实呢 我觉得 不要做一些很奇怪的事情






window.onload = function()
{


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

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

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

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

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

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

顶部
 



当前时区 GMT+8, 现在时间是 2009-7-4 20:10
苏ICP备05080427号

Powered by Discuz! 5.5.0  © 2001-2007 51JS.COM
Processed in 0.084136 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 无忧脚本 - Archiver - WAP