标题: [原创] 通过例子说明如何为JavaScript的私有成员属性添加getter
月影
版主
Rank: 7Rank: 7Rank: 7



UID 24714
精华 8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
 
发表于 2007-4-7 15:16  资料  个人空间  主页 短消息  加为好友  QQ
通过例子说明如何为JavaScript的私有成员属性添加getter



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


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


UID 11749
精华 3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-4-7 16:53  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
经常看到月儿定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。

另外,将该对象赋值给另外一个变量的时候,也不会引发这个getter。

[[i] 本帖最后由 Rimifon 于 2007-4-7 17:11 编辑 [/i]]





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
月影
版主
Rank: 7Rank: 7Rank: 7



UID 24714
精华 8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
 
发表于 2007-4-7 18:04  资料  个人空间  主页 短消息  加为好友  QQ


QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-4-7 16:53 发表
经常看到月儿定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。

另外,将该对象赋 ...

对象的getter通过另一种方法来模拟
可以考考你...用什么来模拟比较合适 ^^

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


UID 65747
精华 11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2007-4-7 19:08  资料  个人空间  短消息  加为好友 
prototype
不过还是想要真正的getter





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


UID 65747
精华 11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2007-4-7 19:30  资料  个人空间  短消息  加为好友 


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






顶部
月影
版主
Rank: 7Rank: 7Rank: 7



UID 24714
精华 8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
 
发表于 2007-4-7 19:48  资料  个人空间  主页 短消息  加为好友  QQ
winter答对咯 ^^

再来个更清晰的例子...

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


顶部
月影
版主
Rank: 7Rank: 7Rank: 7



UID 24714
精华 8
积分 3092
帖子 1230
威望 1548
阅读权限 100
注册 2005-3-9
状态 离线
 
发表于 2007-4-7 19:56  资料  个人空间  主页 短消息  加为好友  QQ
另外...关注一下prototype的另类用法:

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


顶部
anbert (木桑)
大恐龙
Rank: 4


UID 7555
精华 1
积分 687
帖子 282
威望 281
阅读权限 50
注册 2003-12-27
状态 离线
 
发表于 2007-4-7 20:08  资料  个人空间  短消息  加为好友  添加 anbert 为MSN好友 通过MSN和 anbert 交谈 QQ ICQ 状态
简单的东西被搞复杂了

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


UID 65747
精华 11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2007-4-7 21:05  资料  个人空间  短消息  加为好友 
reset放在prototype上比较好吧





顶部
hksar
爬虫
Rank: 2



UID 15281
精华 0
积分 137
帖子 63
威望 73
阅读权限 20
注册 2004-8-8
来自 hong kong
状态 离线
 
发表于 2007-4-7 21:19  资料  个人空间  短消息  加为好友 
有趣

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

[[i] 本帖最后由 hksar 于 2007-4-7 21:20 编辑 [/i]]

顶部
風雲
小恐龙
Rank: 3Rank: 3



UID 54873
精华 0
积分 231
帖子 110
威望 131
阅读权限 30
注册 2006-7-28
状态 离线
 
发表于 2007-4-9 00:27  资料  个人空间  短消息  加为好友 
setter和getter应该是实现这样的效果吧?



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


顶部
ttyp
小恐龙
Rank: 3Rank: 3



UID 5334
精华 0
积分 328
帖子 144
威望 149
阅读权限 30
注册 2003-9-3
状态 离线
 
发表于 2007-4-9 08:54  资料  个人空间  短消息  加为好友 
说白了就是利用对象的默认值机制,引用型对象的默认值是先看有没有实现toString函数,有些值类型的变量是看valueOf函数

顶部
民工精髓
小恐龙
Rank: 3Rank: 3



UID 66672
精华 0
积分 367
帖子 114
威望 113
阅读权限 30
注册 2007-3-21
状态 离线
 
发表于 2007-4-9 09:01  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 [i]Rimifon[/i] 于 2007-4-7 16:53 发表
经常看到月儿定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

使用toString来做js的getter,有一个缺点是,获取某个对象的下级属性时,不会引发这个对象的"getter"。

另外,将该对象赋 ...

给一个对象实现valueOf方法,那么它就直接拥有了可以当作数值来运算的特性,这个东西可以用在比较大小之类的地方,省得写排序函数~





技术是一种气质
顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-4-9 09:14  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
测试了一下,toString实际上已经实现了valueOf。

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






風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-4-9 09:21  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
做运算的时候优先使用的是valueOf



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

[[i] 本帖最后由 Rimifon 于 2007-4-9 09:33 编辑 [/i]]





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
效果
霸王龙
Rank: 6Rank: 6
我是菜菜菜菜菜...鸟


UID 17850
精华 1
积分 2164
帖子 1182
威望 1161
阅读权限 70
注册 2004-10-6
来自 福建、福州<=>厦门
状态 离线
 
发表于 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版说得不错
我也测了一下

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






真是郁闷啊...
顶部
Rimifon (无名)
超级版主
Rank: 8Rank: 8
新手上路


UID 11749
精华 3
积分 5101
帖子 2887
威望 2856
阅读权限 150
注册 2004-5-22
来自 湖南长沙
状态 离线
 
发表于 2007-4-9 14:45  资料  个人空间  主页 短消息  加为好友  添加 Rimifon 为MSN好友 通过MSN和 Rimifon 交谈
月影老是拿出这个“valueOf”在大家眼前晃来晃去,难道是为了提醒大家不要忽略valueOf的存在?





風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)
顶部
winter
超级版主
Rank: 8Rank: 8
软虫


UID 65747
精华 11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2007-4-9 15:22  资料  个人空间  短消息  加为好友 
嘿嘿 我跟月影老大学的第一个东西就是这个^^





顶部
民工精髓
小恐龙
Rank: 3Rank: 3



UID 66672
精华 0
积分 367
帖子 114
威望 113
阅读权限 30
注册 2007-3-21
状态 离线
 
发表于 2007-4-9 17:19  资料  个人空间  短消息  加为好友 


QUOTE:
测试了一下,toString实际上已经实现了valueOf。

关于这个,我觉得从结果上看,toString跟valueOf一致,是因为js的自动类型转换。刚才想了半天,想要举个反例,没想出来

呃,我说个不太确切的吧,复数,假设有一个Complex,它的toString是按照格式输出a+bi这样,valueOf假设取的是它这个点到坐标原点的距离r,那么,Complex的实例就可以直接用比较操作符来判断大小。

唉,表达能力极其差劲





技术是一种气质
顶部
winter
超级版主
Rank: 8Rank: 8
软虫


UID 65747
精华 11
积分 6129
帖子 2854
威望 2845
阅读权限 150
注册 2007-2-27
状态 离线
 
发表于 2007-4-9 18:59  资料  个人空间  短消息  加为好友 


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

这个应该这样理解
toString是用于输出的
valueOf是用于运算的,在不强制指定valueOf时 它默认返回toString





顶部
 



当前时区 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

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