游客:
注册
|
登录
|
会员
|
搜索
|
统计
|
帮助
无忧脚本
»
JavaScript & VBScript & DHTML 脚本技术讨论版
» javascript中实现override,overload和类似c#中的property
‹‹ 上一主题
|
下一主题 ››
投票
交易
悬赏
活动
打印
|
推荐
|
订阅
|
收藏
标题:
[原创]
javascript中实现override,overload和类似c#中的property
normanzb
爬虫
UID 18544
精华 0
积分 63
帖子 20
威望 40
阅读权限 20
注册 2004-10-23
状态 离线
#1
大
中
小
使用道具
发表于 2008-5-15 16:57
资料
个人空间
短消息
加为好友
javascript中实现override,overload和类似c#中的property
先把这个script加到你的页面里:
http://code.google.com/p/doufu/source/browse/trunk/nsc.js
实现一个基础类和继承类:
<html> <head></head> <body> <script src="http://doufu.googlecode.com/svn/trunk/nsc.js"> </script> <script> window.onload = function() { BaseClassA = function() { nsc.OOP.Class(this); this.SayHello = function() { return "Hello world!"; } } DerivedFromA = function() { nsc.OOP.Class(this); this.Inherit(BaseClassA); } ba = new BaseClassA(); da = new DerivedFromA(); alert(ba.SayHello()); alert(da.SayHello()); alert(da.InstanceOf(BaseClassA)); } </script>
提示:您可以先修改部分代码再运行
在上面的类中,我们可以用this.OverrideMethod实现类似Override的功能, 例子
<script src="http://doufu.googlecode.com/svn/trunk/nsc.js"> </script> <script> window.onload = function() { BaseClassA = function() { nsc.OOP.Class(this); this.SayHello = function() { return "Hello world!"; } this.InvokeSay = function() { alert(this.SayHello()); } } DerivedFromA = function() { nsc.OOP.Class(this); this.Inherit(BaseClassA); this.OverrideMethod("SayHello", function() { return "Overrided " + this._base_SayHello(); } ); } ba = new BaseClassA(); da = new DerivedFromA(); ba.InvokeSay(); da.InvokeSay(); } </script>
提示:您可以先修改部分代码再运行
用This.NewProperty实现类似Property 的功能
BaseClassA = function() { nsc.OOP.Class(this); // Create Properties var _noun = "world"; this.NewProperty("Noun"); this.Noun.Get = function() { return _noun; } this.Noun.Set = function(value) { _noun = value; } var _count = 0; this.NewProperty("Count"); this.Count.Get = function() { return _count; } this.Count.Set = function(value) { _count = value; } }
提示:您可以先修改部分代码再运行
并且在一些特殊情况下,允许直接使用 this.属性名 来取得get方法的返回值:
<script src="http://doufu.googlecode.com/svn/trunk/nsc.js"> </script> <script> window.onload = function() { BaseClassA = function() { nsc.OOP.Class(this); this.SayHello = function() { // Explicitly assign property value and implicitly get property value this.Count(this.Count + 1); // Implicitly convert property to string return "Hello " + this.Noun + "! " + this.Count; } this.InvokeSay = function() { alert(this.SayHello()); } // Create Properties var _noun = "world"; this.NewProperty("Noun"); this.Noun.Get = function() { return _noun; } this.Noun.Set = function(value) { _noun = value; } var _count = 0; this.NewProperty("Count"); this.Count.Get = function() { return _count; } this.Count.Set = function(value) { _count = value; } } DerivedFromA = function() { nsc.OOP.Class(this); this.Inherit(BaseClassA); this.OverrideMethod("SayHello", function() { return "Overrided " + this._base_SayHello(); } ); } ba = new BaseClassA(); da = new DerivedFromA(); ba.InvokeSay(); da.InvokeSay(); // Explicitly assign value da.Count(10) da.InvokeSay(); } </script>
提示:您可以先修改部分代码再运行
用this.OverloadMethod实现overload:
this.OverloadMethod("方法名", function()
{
//coding here
});
overload method 的sample代码等等写
[[i] 本帖最后由 normanzb 于 2008-5-15 17:19 编辑 [/i]]
[广告]
新浪互动社区急招RIA开发工程师
normanzb
爬虫
UID 18544
精华 0
积分 63
帖子 20
威望 40
阅读权限 20
注册 2004-10-23
状态 离线
#2
大
中
小
使用道具
发表于 2008-5-15 17:04
资料
个人空间
短消息
加为好友
貌似乎在论坛里直接点运行不行?
存到本地可以
Update: 可以直接点开运行了
[[i] 本帖最后由 normanzb 于 2008-5-15 17:20 编辑 [/i]]
[广告]
新浪互动社区急招RIA开发工程师
winter
超级版主
软虫
UID 65747
精华
11
积分 5829
帖子 2741
威望 2746
阅读权限 150
注册 2007-2-27
状态 离线
#3
大
中
小
使用道具
发表于 2008-5-15 23:43
资料
个人空间
短消息
加为好友
其实呢 我觉得 不要做一些很奇怪的事情
<html> <head></head> <body> <script> window.onload = function() { BaseClassA = function() { this.SayHello = function() { return "Hello world!"; } } DerivedFromA = function() { BaseClassA.call(this); } ba = new BaseClassA(); da = new DerivedFromA(); alert(ba.SayHello()); alert(da.SayHello()); //这个InstanceOf其实没什么用吧 //alert(da.InstanceOf(BaseClassA)); } </script>
提示:您可以先修改部分代码再运行
<script> window.onload = function() { BaseClassA = function() { this.SayHello = function() { return "Hello world!"; } this.InvokeSay = function() { alert(this.SayHello()); } } DerivedFromA = function() { BaseClassA.call(this); _base_SayHello=this.SayHello; this["SayHello"]=function() { return "Overrided " + _base_SayHello.apply(this,arguments); } } ba = new BaseClassA(); da = new DerivedFromA(); ba.InvokeSay(); da.InvokeSay(); } </script>
提示:您可以先修改部分代码再运行
第三个的话
显然get是在valueOf 而set是无效的
这个封装成这样不是很好 很容易让人误会 如果是ff的话 有原生的__defineSetter__和__defineGetter__ IE就不行了
[[i] 本帖最后由 winter 于 2008-5-15 23:46 编辑 [/i]]
我的blog
[广告]
新浪互动社区急招RIA开发工程师
Rimifon
(无名)
超级版主
新手上路
UID 11749
精华
3
积分 5017
帖子 2847
威望 2813
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
#4
大
中
小
使用道具
发表于 2008-5-16 07:18
资料
个人空间
主页
短消息
加为好友
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还不能完美的实现。
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
[广告]
新浪互动社区急招RIA开发工程师
normanzb
爬虫
UID 18544
精华 0
积分 63
帖子 20
威望 40
阅读权限 20
注册 2004-10-23
状态 离线
#5
大
中
小
使用道具
发表于 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]]
[广告]
新浪互动社区急招RIA开发工程师
normanzb
爬虫
UID 18544
精华 0
积分 63
帖子 20
威望 40
阅读权限 20
注册 2004-10-23
状态 离线
#6
大
中
小
使用道具
发表于 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 编辑
]
[广告]
新浪互动社区急招RIA开发工程师
投票
交易
悬赏
活动
无忧脚本
无忧脚本技术讨论区
> 原创文章 & 讨论汇总版
> Html & XHtml & CSS 网页制作讨论版
> JavaScript & VBScript & DHTML 脚本技术讨论版
> XML & XSL & XPath & VML 网页技术讨论版
> ASP & Access & SQL Server 后台编程讨论版
> PHP & MySQL 后台编程讨论版
> JSP & Java & J2SE 后台编程讨论版
> .Net 相关技术讨论版
> Web 服务器技术
> Flex & Flash 技术讨论版
> Web UI & 图形技术讨论版
无忧脚本资源服务区
> 经典代码、教程资源库
> 参考手册、常用软件资源库
> 无忧合租服务器讨论版
无忧脚本休闲区
> 休闲留言板
> 招聘求职、网站推荐、广告信息版
> 无忧站务管理版
> 垃圾帖回收站
控制面板首页
编辑个人资料
积分交易
公众用户组
好友列表
升级个人空间
基本概况
流量统计
客户软件
发帖量记录
论坛排行
主题排行
发帖排行
积分排行
在线时间
管理团队
当前时区 GMT+8, 现在时间是 2008-9-6 08:46
苏ICP备05080427号
Powered by
Discuz!
5.5.0
© 2001-2007
51JS.COM
Processed in 0.075588 second(s), 6 queries , Gzip enabled
TOP
清除 Cookies
-
联系我们
-
无忧脚本
-
Archiver
-
WAP