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

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

查看: 2906|回复: 19

[原创] 通过例子说明如何为JavaScript的私有成员属性添加getter [复制链接]

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-4-7 15:16:34 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
一键分享 一键分享
  1. <script>
  2. function List()
  3. {

  4.          var m_members = []; //私有成员

  5.          m_members = Array.apply(m_members, arguments);

  6.          this.length = {
  7.                    valueOf:function(){
  8.                             return m_members.length;
  9.                    },
  10.                    toString:function(){
  11.                             return m_members.length;
  12.                    }
  13.          }

  14.          this.toString = function()
  15.          {
  16.                    return m_members.toString();
  17.          }

  18.          this.add = function()
  19.          {
  20.                    m_members.push.apply(m_members, arguments);
  21.          }
  22. }
  23. //alert(List);
  24. var list = new List(1,2,3);
  25. alert(list);
  26. alert(list.length);
  27. list.add(4,5,6);
  28. alert(list);
  29. alert(list.length);
  30. </script>
复制代码运行代码另存代码

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2007-4-7 16:53:16 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
经常看到月儿:L定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

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

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

[ 本帖最后由 Rimifon 于 2007-4-7 17:11 编辑 ]
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-4-7 18:04:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
原帖由 Rimifon 于 2007-4-7 16:53 发表
经常看到月儿:L定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

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

另外,将该对象赋 ...


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

使用道具 举报

超级版主

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

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-4-7 19:08:11 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
prototype
不过还是想要真正的getter

使用道具 举报

超级版主

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

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-4-7 19:30:10 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
  1. <script>
  2. function List()
  3. {

  4.          var m_members = []; //私有成员

  5.          m_members = Array.apply(m_members, arguments);
  6.          
  7.          function Member(){};
  8.          Member.prototype=m_members
  9.          this.members = new Member();
  10.          this.toString = function()
  11.          {
  12.                    return m_members.toString();
  13.          }

  14.          this.add = function()
  15.          {
  16.                    m_members.push.apply(m_members, arguments);
  17.          }
  18. }
  19. //alert(List);
  20. var list = new List(1,2,3);
  21. alert(list);
  22. alert(list.members.length);
  23. list.add(4,5,6);
  24. alert(list);
  25. alert(list.members.length);
  26. </script>
复制代码运行代码另存代码

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-4-7 19:48:07 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
winter答对咯 ^^

再来个更清晰的例子...
  1. <script>
  2. function Polygan()
  3. {
  4.         var m_points = [];

  5.         m_points = Array.apply(m_points, arguments);

  6.         function GETTER(){};
  7.         GETTER.prototype = m_points[0];
  8.         this.firstPoint = new GETTER();

  9.         this.length = {
  10.                 valueOf : function(){return m_points.length},
  11.                 toString : function(){return m_points.length}
  12.         }

  13.         this.add = function(){
  14.                 m_points.push.apply(m_points, arguments);
  15.         }

  16.         this.getPoint = function(idx)
  17.         {
  18.                 return m_points[idx];
  19.         }
  20. }
  21. var p = new Polygan({x:1, y:2},{x:2, y:4},{x:2, y:6});
  22. alert(p.length);
  23. alert(p.firstPoint.x);
  24. alert(p.firstPoint.y);
  25. p.firstPoint.x = 100; //不小心写了它的值
  26. alert(p.getPoint(0).x);  //不会影响到实际的私有成员
  27. delete p.firstPoint.x; //恢复
  28. alert(p.firstPoint.x);
  29. </script>
复制代码运行代码另存代码

使用道具 举报

Rank: 8Rank: 8

注册时间
2005-3-9
威望
1952
阅读权限
150
积分
4347
帖子
1577
精华
9
UID
24714
状态
当前离线
发表于 2007-4-7 19:56:43 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ 查看个人网站
另外...关注一下prototype的另类用法:
  1. <script>
  2. function classA()
  3. {
  4.         this.a = 100;
  5.         this.b = 200;
  6.         this.c = 300;

  7.         this.reset = function()
  8.         {
  9.                 for(var each in this)
  10.                 {
  11.                         delete this[each];
  12.                 }
  13.         }
  14. }
  15. classA.prototype = new classA();

  16. var a = new classA();
  17. alert(a.a);
  18. a.a *= 2;
  19. a.b *= 2;
  20. a.c *= 2;
  21. alert(a.a);
  22. alert(a.b);
  23. alert(a.c);
  24. a.reset();
  25. alert(a.a);
  26. alert(a.b);
  27. alert(a.c);
  28. </script>
复制代码运行代码另存代码

使用道具 举报

Rank: 4

升级  37.6%

注册时间
2003-12-27
威望
279
阅读权限
50
积分
688
帖子
280
精华
1
UID
7555
状态
当前离线
发表于 2007-4-7 20:08:59 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ ICQ
简单的东西被搞复杂了

使用道具 举报

超级版主

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

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-4-7 21:05:35 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
reset放在prototype上比较好吧

使用道具 举报

Rank: 4

升级  60.6%

注册时间
2004-8-8
威望
170
阅读权限
50
积分
803
帖子
174
精华
0
UID
15281
状态
当前离线
发表于 2007-4-7 21:19:28 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 QQ
有趣
  1. <script>
  2. function classA()
  3. {
  4.         this.a = 100;
  5.         this.b = 200;
  6.         this.c = 300;
  7.                     this.list=new Array(this.a,this.b,this.c);
  8.         this.reset = function()
  9.         {
  10.                 for(var each in this)
  11.                 {
  12.                         delete this[each];
  13.                 }
  14.         }
  15. }
  16. classA.prototype = new classA;

  17. var a = new classA;
  18. var b = new classA;
  19. a.list.push(1,2,3);
  20. b.list.push(4,5,6);
  21. alert(a.list);
  22. alert(b.list);
  23. a.reset();
  24. alert(a.list);
  25. alert(b.list);
  26. </script>
复制代码运行代码另存代码

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

使用道具 举报

Rank: 3Rank: 3

升级  11.33%

注册时间
2006-7-28
威望
132
阅读权限
30
积分
234
帖子
111
精华
0
UID
54873
状态
当前离线
发表于 2007-4-9 00:27:58 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料

setter和getter应该是实现这样的效果吧?

  1. 输入a值:<input id=ipt>
  2. <input type=button onclick="ins.a = document.all.ipt.value" value="设置">
  3. <input type=button onclick="alert(ins.a)" value="获取">
  4. <script>
  5. var ins = new Class1;
  6. function Class1()
  7. {
  8.     var _class = this;
  9.     this. a = {"Value" : ""};
  10.     (function set_a(value)
  11.     {
  12.         if(value !== _class.a)
  13.         {
  14.             alert("a被更改了。");
  15.             value.Value = _class.a;
  16.             _class.a = value;
  17.         }
  18.         setTimeout(function(){set_a(value)});
  19.     })(this.a);
  20.     this.a.toString = function()
  21.     {
  22.         alert("您获取了a");
  23.         return _class.a.Value;
  24.     }
  25. }
  26. </script>
复制代码运行代码另存代码

使用道具 举报

Rank: 3Rank: 3

升级  41%

注册时间
2003-9-3
威望
144
阅读权限
30
积分
323
帖子
141
精华
0
UID
5334
状态
当前离线
发表于 2007-4-9 08:54:57 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
说白了就是利用对象的默认值机制,引用型对象的默认值是先看有没有实现toString函数,有些值类型的变量是看valueOf函数

使用道具 举报

Rank: 4

升级  6%

注册时间
2007-3-21
威望
158
阅读权限
50
积分
530
帖子
153
精华
0
UID
66672
状态
当前离线
发表于 2007-4-9 09:01:02 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 Rimifon 于 2007-4-7 16:53 发表
经常看到月儿:L定义valueOf方法,能不能跟大家说一下,什么情况下会用到valueOf?

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

另外,将该对象赋 ...


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

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2007-4-9 09:14:32 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
测试了一下,toString实际上已经实现了valueOf。
  1. <script>
  2. var insValue = new Class1;
  3. alert([insValue, insValue + 1]);
  4. var insString = new Class2;
  5. alert([insString, insString + 1]);
  6. function Class1()
  7. {
  8.     this.a = 5;
  9.     this.valueOf = new Function("return this.a");
  10. }
  11. function Class2()
  12. {
  13.     this.a = 5;
  14.     this.toString = new Function("return this.a");
  15. }</script>
复制代码运行代码另存代码
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2007-4-9 09:21:20 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站

做运算的时候优先使用的是valueOf

  1. <script>
  2. var ins = new Class1;
  3. alert([ins, ins + 1, ins == "a", ins == 10]);
  4. delete ins.valueOf;
  5. alert([ins, ins + 1, ins == "a", ins == 10]);
  6. function Class1()
  7. {
  8.     this.a = "a";
  9.     this.valueOf = new Function("return parseInt(this.a, 16)");
  10.     this.toString = new Function("return this.a");
  11. }</script>
复制代码运行代码另存代码

[ 本帖最后由 Rimifon 于 2007-4-9 09:33 编辑 ]
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

霸王龙

我是菜菜菜菜菜...鸟

Rank: 6Rank: 6

升级  59.25%

注册时间
2004-10-6
威望
1158
阅读权限
70
积分
2185
帖子
1181
精华
1
UID
17850
状态
当前离线
发表于 2007-4-9 14:21:07 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
原帖由 Rimifon 于 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版说得不错
我也测了一下

  1. <SCRIPT LANGUAGE="JavaScript">
  2. <!--
  3.         function class1()
  4.         {
  5.                 var a="a";
  6.                 this.toString=function(){return "b";}
  7.         }
  8.         var t=new class1();
  9.         alert(t.valueOf());
  10. //-->
  11. </SCRIPT>
复制代码运行代码另存代码
这里不是广告位啊,别乱点...!

使用道具 举报

超级版主

新手上路

Rank: 8Rank: 8

注册时间
2004-5-22
威望
3336
阅读权限
150
积分
6241
帖子
3329
精华
3
UID
11749
状态
当前离线
发表于 2007-4-9 14:45:18 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料 查看个人网站
月影老是拿出这个“valueOf”在大家眼前晃来晃去,难道是为了提醒大家不要忽略valueOf的存在?:lol
風雲工作室
=========
广告位招租(做在老百姓眼皮底下的广告)

使用道具 举报

超级版主

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

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-4-9 15:22:52 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
嘿嘿 我跟月影老大学的第一个东西就是这个^^

使用道具 举报

Rank: 4

升级  6%

注册时间
2007-3-21
威望
158
阅读权限
50
积分
530
帖子
153
精华
0
UID
66672
状态
当前离线
发表于 2007-4-9 17:19:40 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
测试了一下,toString实际上已经实现了valueOf。


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

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

唉,表达能力极其差劲:funk: :Q
技术是一种气质

使用道具 举报

超级版主

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

Rank: 8Rank: 8

注册时间
2007-2-27
威望
3584
阅读权限
150
积分
8408
帖子
3597
精华
12
UID
65747
状态
当前离线
发表于 2007-4-9 18:59:52 |显示全部楼层 |串个门|加好友|打招呼|发消息 |
查看详细资料
  1. <SCRIPT LANGUAGE="JavaScript">
  2. <!--
  3. alert(Function.prototype.valueOf==Array.prototype.valueOf);
  4. alert(Function.prototype.toString==Array.prototype.toString);

  5. function ClassA()
  6. {
  7.     this.valueOf=function(){return "a";}
  8.     this.toString=function(){return "A";}
  9. }
  10. alert(new ClassA+"");
  11. alert(new ClassA);
  12. //-->
  13. </SCRIPT>
复制代码运行代码另存代码

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

使用道具 举报

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

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

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

Powered by Discuz! X2

© 1999-2011 无忧脚本

回顶部