游客:
注册
|
登录
|
会员
|
搜索
|
统计
|
帮助
无忧脚本
»
JavaScript & VBScript & DHTML 脚本技术讨论版
» 通过例子说明如何为JavaScript的私有成员属性添加getter
‹‹ 上一主题
|
下一主题 ››
投票
交易
悬赏
活动
打印
|
推荐
|
订阅
|
收藏
标题:
[原创]
通过例子说明如何为JavaScript的私有成员属性添加getter
月影
版主
UID 24714
精华
8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
#1
大
中
小
使用道具
发表于 2007-4-7 15:16
资料
个人空间
主页
短消息
加为好友
通过例子说明如何为JavaScript的私有成员属性添加getter
<script> function List() { var m_members = []; //私有成员 m_members = Array.apply(m_members, arguments); this.length = { valueOf:function(){ return m_members.length; }, toString:function(){ return m_members.length; } } this.toString = function() { return m_members.toString(); } this.add = function() { m_members.push.apply(m_members, arguments); } } //alert(List); var list = new List(1,2,3); alert(list); alert(list.length); list.add(4,5,6); alert(list); alert(list.length); </script>
提示:您可以先修改部分代码再运行
Rimifon
(无名)
超级版主
新手上路
UID 11749
精华
3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
#2
大
中
小
使用道具
发表于 2007-4-7 16:53
资料
个人空间
主页
短消息
加为好友
经常看到月儿
定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?
使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。
另外,将该对象赋值给另外一个变量的时候,也不会引发这个getter。
[[i] 本帖最后由 Rimifon 于 2007-4-7 17:11 编辑 [/i]]
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
月影
版主
UID 24714
精华
8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
#3
大
中
小
使用道具
发表于 2007-4-7 18:04
资料
个人空间
主页
短消息
加为好友
QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-4-7 16:53 发表
经常看到月儿
定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?
使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。
另外,将该对象赋 ...
对象的getter通过另一种方法来模拟
可以考考你...用什么来模拟比较合适 ^^
winter
超级版主
软虫
UID 65747
精华
11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
#4
大
中
小
使用道具
发表于 2007-4-7 19:08
资料
个人空间
短消息
加为好友
prototype
不过还是想要真正的getter
我的blog
winter
超级版主
软虫
UID 65747
精华
11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
#5
大
中
小
使用道具
发表于 2007-4-7 19:30
资料
个人空间
短消息
加为好友
<script> function List() { var m_members = []; //私有成员 m_members = Array.apply(m_members, arguments); function Member(){}; Member.prototype=m_members this.members = new Member(); this.toString = function() { return m_members.toString(); } this.add = function() { m_members.push.apply(m_members, arguments); } } //alert(List); var list = new List(1,2,3); alert(list); alert(list.members.length); list.add(4,5,6); alert(list); alert(list.members.length); </script>
提示:您可以先修改部分代码再运行
我的blog
月影
版主
UID 24714
精华
8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
#6
大
中
小
使用道具
发表于 2007-4-7 19:48
资料
个人空间
主页
短消息
加为好友
winter答对咯 ^^
再来个更清晰的例子...
<script> function Polygan() { var m_points = []; m_points = Array.apply(m_points, arguments); function GETTER(){}; GETTER.prototype = m_points[0]; this.firstPoint = new GETTER(); this.length = { valueOf : function(){return m_points.length}, toString : function(){return m_points.length} } this.add = function(){ m_points.push.apply(m_points, arguments); } this.getPoint = function(idx) { return m_points[idx]; } } var p = new Polygan({x:1, y:2},{x:2, y:4},{x:2, y:6}); alert(p.length); alert(p.firstPoint.x); alert(p.firstPoint.y); p.firstPoint.x = 100; //不小心写了它的值 alert(p.getPoint(0).x); //不会影响到实际的私有成员 delete p.firstPoint.x; //恢复 alert(p.firstPoint.x); </script>
提示:您可以先修改部分代码再运行
月影
版主
UID 24714
精华
8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
#7
大
中
小
使用道具
发表于 2007-4-7 19:56
资料
个人空间
主页
短消息
加为好友
另外...关注一下prototype的另类用法:
<script> function classA() { this.a = 100; this.b = 200; this.c = 300; this.reset = function() { for(var each in this) { delete this[each]; } } } classA.prototype = new classA(); var a = new classA(); alert(a.a); a.a *= 2; a.b *= 2; a.c *= 2; alert(a.a); alert(a.b); alert(a.c); a.reset(); alert(a.a); alert(a.b); alert(a.c); </script>
提示:您可以先修改部分代码再运行
anbert
(木桑)
大恐龙
UID 7555
精华
1
积分 687
帖子 282
威望 281
阅读权限 50
注册 2003-12-27
状态 离线
#8
大
中
小
使用道具
发表于 2007-4-7 20:08
资料
个人空间
短消息
加为好友
简单的东西被搞复杂了
winter
超级版主
软虫
UID 65747
精华
11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
#9
大
中
小
使用道具
发表于 2007-4-7 21:05
资料
个人空间
短消息
加为好友
reset放在prototype上比较好吧
我的blog
hksar
爬虫
UID 15281
精华 0
积分 137
帖子 63
威望 73
阅读权限 20
注册 2004-8-8
来自 hong kong
状态 离线
#10
大
中
小
使用道具
发表于 2007-4-7 21:19
资料
个人空间
短消息
加为好友
有趣
<script> function classA() { this.a = 100; this.b = 200; this.c = 300; this.list=new Array(this.a,this.b,this.c); this.reset = function() { for(var each in this) { delete this[each]; } } } classA.prototype = new classA; var a = new classA; var b = new classA; a.list.push(1,2,3); b.list.push(4,5,6); alert(a.list); alert(b.list); a.reset(); alert(a.list); alert(b.list); </script>
提示:您可以先修改部分代码再运行
[[i] 本帖最后由 hksar 于 2007-4-7 21:20 编辑 [/i]]
風雲
小恐龙
UID 54873
精华 0
积分 231
帖子 110
威望 131
阅读权限 30
注册 2006-7-28
状态 离线
#11
大
中
小
使用道具
发表于 2007-4-9 00:27
资料
个人空间
短消息
加为好友
setter和getter应该是实现这样的效果吧?
输入a值:<input id=ipt> <input type=button onclick="ins.a = document.all.ipt.value" value="设置"> <input type=button onclick="alert(ins.a)" value="获取"> <script> var ins = new Class1; function Class1() { var _class = this; this. a = {"Value" : ""}; (function set_a(value) { if(value !== _class.a) { alert("a被更改了。"); value.Value = _class.a; _class.a = value; } setTimeout(function(){set_a(value)}); })(this.a); this.a.toString = function() { alert("您获取了a"); return _class.a.Value; } } </script>
提示:您可以先修改部分代码再运行
ttyp
小恐龙
UID 5334
精华 0
积分 328
帖子 144
威望 149
阅读权限 30
注册 2003-9-3
状态 离线
#12
大
中
小
使用道具
发表于 2007-4-9 08:54
资料
个人空间
短消息
加为好友
说白了就是利用对象的默认值机制,引用型对象的默认值是先看有没有实现toString函数,有些值类型的变量是看valueOf函数
民工精髓
小恐龙
UID 66672
精华 0
积分 367
帖子 114
威望 113
阅读权限 30
注册 2007-3-21
状态 离线
#13
大
中
小
使用道具
发表于 2007-4-9 09:01
资料
个人空间
短消息
加为好友
QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-4-7 16:53 发表
经常看到月儿
定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?
使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。
另外,将该对象赋 ...
给一个对象实现valueOf方法,那么它就直接拥有了可以当作数值来运算的特性,这个东西可以用在比较大小之类的地方,省得写排序函数~
技术是一种气质
Rimifon
(无名)
超级版主
新手上路
UID 11749
精华
3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
#14
大
中
小
使用道具
发表于 2007-4-9 09:14
资料
个人空间
主页
短消息
加为好友
测试了一下,toString实际上已经实现了valueOf。
<script> var insValue = new Class1; alert([insValue, insValue + 1]); var insString = new Class2; alert([insString, insString + 1]); function Class1() { this.a = 5; this.valueOf = new Function("return this.a"); } function Class2() { this.a = 5; this.toString = new Function("return this.a"); }</script>
提示:您可以先修改部分代码再运行
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
Rimifon
(无名)
超级版主
新手上路
UID 11749
精华
3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
#15
大
中
小
使用道具
发表于 2007-4-9 09:21
资料
个人空间
主页
短消息
加为好友
做运算的时候优先使用的是valueOf
<script> var ins = new Class1; alert([ins, ins + 1, ins == "a", ins == 10]); delete ins.valueOf; alert([ins, ins + 1, ins == "a", ins == 10]); function Class1() { this.a = "a"; this.valueOf = new Function("return parseInt(this.a, 16)"); this.toString = new Function("return this.a"); }</script>
提示:您可以先修改部分代码再运行
[[i] 本帖最后由 Rimifon 于 2007-4-9 09:33 编辑 [/i]]
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
效果
霸王龙
我是菜菜菜菜菜...鸟
UID 17850
精华
1
积分 2164
帖子 1182
威望 1161
阅读权限 70
注册 2004-10-6
来自 福建、福州<=>厦门
状态 离线
#16
大
中
小
使用道具
发表于 2007-4-9 14:21
资料
个人空间
短消息
加为好友
QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-4-9 09:14 发表
测试了一下,toString实际上已经实现了valueOf。
var insValue = new Class1;
alert();
var insString = new Class2;
alert();
function Class1()
{
this.a = 5;
this.valueOf = new Function( ...
R版说得不错
我也测了一下
<SCRIPT LANGUAGE="JavaScript"> <!-- function class1() { var a="a"; this.toString=function(){return "b";} } var t=new class1(); alert(t.valueOf()); //--> </SCRIPT>
提示:您可以先修改部分代码再运行
真是郁闷啊...
Rimifon
(无名)
超级版主
新手上路
UID 11749
精华
3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
#17
大
中
小
使用道具
发表于 2007-4-9 14:45
资料
个人空间
主页
短消息
加为好友
月影老是拿出这个“valueOf”在大家眼前晃来晃去,难道是为了提醒大家不要忽略valueOf的存在?
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
winter
超级版主
软虫
UID 65747
精华
11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
#18
大
中
小
使用道具
发表于 2007-4-9 15:22
资料
个人空间
短消息
加为好友
嘿嘿 我跟月影老大学的第一个东西就是这个^^
我的blog
民工精髓
小恐龙
UID 66672
精华 0
积分 367
帖子 114
威望 113
阅读权限 30
注册 2007-3-21
状态 离线
#19
大
中
小
使用道具
发表于 2007-4-9 17:19
资料
个人空间
短消息
加为好友
QUOTE:
测试了一下,toString实际上已经实现了valueOf。
关于这个,我觉得从结果上看,toString跟valueOf一致,是因为js的自动类型转换。刚才想了半天,想要举个反例,没想出来
呃,我说个不太确切的吧,复数,假设有一个Complex,它的toString是按照格式输出a+bi这样,valueOf假设取的是它这个点到坐标原点的距离r,那么,Complex的实例就可以直接用比较操作符来判断大小。
唉,表达能力极其差劲
技术是一种气质
winter
超级版主
软虫
UID 65747
精华
11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
#20
大
中
小
使用道具
发表于 2007-4-9 18:59
资料
个人空间
短消息
加为好友
<SCRIPT LANGUAGE="JavaScript"> <!-- alert(Function.prototype.valueOf==Array.prototype.valueOf); alert(Function.prototype.toString==Array.prototype.toString); function ClassA() { this.valueOf=function(){return "a";} this.toString=function(){return "A";} } alert(new ClassA+""); alert(new ClassA); //--> </SCRIPT>
提示:您可以先修改部分代码再运行
这个应该这样理解
toString是用于输出的
valueOf是用于运算的,在不强制指定valueOf时 它默认返回toString
我的blog
投票
交易
悬赏
活动
无忧脚本
无忧脚本技术讨论区
> 原创文章 & 讨论汇总版
> 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-11-22 07:47
苏ICP备05080427号
Powered by
Discuz!
5.5.0
© 2001-2007
51JS.COM
Processed in 0.083320 second(s), 6 queries , Gzip enabled
TOP
清除 Cookies
-
联系我们
-
无忧脚本
-
Archiver
-
WAP