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

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

搜索
查看: 5128|回复: 5

对javascript重载的深入探讨

[复制链接]
发表于 2005-4-22 18:08:53 | 显示全部楼层 |阅读模式
发现javascript对象的重载是个有趣的问题...
研究还在进行中...
希望大家一起来探讨...
PS:感谢泣红亭在http://bbs.51js.com/viewthread.php?tid=36952&fpage=1中的论述,为月影提供了思路...


  1. <script>
  2. function Point2D(x, y)
  3. {
  4.         this.x = x;
  5.         this.y = y;
  6.         Point2D.prototype.quadrant = function()
  7.         {
  8.                 if (x > 0 && y > 0) return "I";
  9.                 else if (x < 0 && y > 0) return "II";
  10.                 else if (x < 0 && y < 0) return "III";
  11.                 else if (x > 0 && y < 0) return "IV";
  12.                 else if (x == 0) return "x-axis";
  13.                 else if (y == 0) return "y-axis";
  14.                 else throw new Error();
  15.         }
  16.         Point2D.prototype.toVector = function()
  17.         {
  18.                 return new Vector2D(x, y);
  19.         }
  20.         Point2D.prototype.distance = function() //求距离
  21.         {
  22.                 if (arguments.length == 1 && arguments[0] instanceof Point2D)
  23.                 {
  24.                         return this._point_distance.apply(this, arguments);
  25.                 }
  26.                 else if (arguments.length == 1 && arguments[0] instanceof Vector2D)
  27.                 {
  28.                         return this._vector_distance.apply(this, arguments);
  29.                 }
  30.                 else
  31.                 {
  32.                         throw new Error("Argument Error!");
  33.                 }
  34.         }
  35.         Point2D.prototype._point_distance = function(p)                //求两点之间的距离(函数重载)
  36.         {
  37.                 return (new Vector2D(p,this)).length();
  38.         }
  39.         Point2D.prototype._vector_distance = function(v)                //求点到向量的距离(函数重载)
  40.         {
  41.                 var v1 = new Vector2D(this, v.start);
  42.                 var v2 = new Vector2D(this, v.end);

  43.                 var area = Math.abs(v1.cross(v2));  //平行四边形面积 = v1 X v2 = |v1v2|sin(v1,v2)
  44.                
  45.                 return area / v.length();   //平行四边形面积除以底边长度即为点到向量的距离
  46.         }
  47. }
  48. function Vector2D()
  49. {
  50.         if (arguments.length == 2 && arguments[0] instanceof Point2D && arguments[1] instanceof Point2D)
  51.         {
  52.                 _point_point_Vector2D.apply(this, arguments);
  53.         }
  54.         else if (arguments.length == 2 && !isNaN(arguments[0]) && !isNaN(arguments[1]))
  55.         {
  56.                 _double_double_Vector2D.apply(this, arguments);
  57.         }
  58.         else if (arguments.length == 4 && !isNaN(arguments[0]) && !isNaN(arguments[1])
  59.                 && !isNaN(arguments[2]) && !isNaN(arguments[3]))
  60.         {
  61.                 _double_double_double_double_Vector2D.apply(this, arguments);
  62.         }
  63.         else
  64.         {
  65.                 throw new Error("Argument Error!");
  66.         }
  67. }
  68. function _point_point_Vector2D(p1, p2)   
  69. {
  70.         this.start = p1;
  71.         this.end = p2;
  72.         Vector2D.prototype.length = function()        //求向量的长度
  73.         {
  74.                 return Math.sqrt(this.pond_x() * this.pond_x() + this.pond_y() * this.pond_y());
  75.         }
  76.         Vector2D.prototype.pond_x = function() //x方向分量
  77.         {
  78.                 return this.start.x - this.end.x;
  79.         }
  80.         Vector2D.prototype.pond_y = function()
  81.         {
  82.                 return this.start.y - this.end.y;
  83.         }
  84.         Vector2D.prototype.cross = function(v)   //求向量的交积 P1 X P2 = x1y2 - x2y1
  85.         {
  86.                 return this.pond_x() * v.pond_y() - v.pond_x() * this.pond_y();
  87.         }
  88. }
  89. function _double_double_Vector2D(x,y) //重载构造函数Vector2D
  90. {
  91.         this.pointPairs = new Array();
  92.         this.pointPairs[0] = new Point2D(0, 0);
  93.         this.pointPairs[1] = new Point2D(x, y);

  94.         _point_point_Vector2D.apply(this, this.pointPairs);
  95. }
  96. function _double_double_double_double_Vector2D(x1, y1, x2, y2)  //重载构造函数Vector2D
  97. {
  98.         this.pointPairs = new Array();
  99.         this.pointPairs[0] = new Point2D(x1, y1);
  100.         this.pointPairs[1] = new Point2D(x2, y2);

  101.         _point_point_Vector2D.apply(this, this.pointPairs);
  102. }
  103. var p1 = new Point2D(0,0);
  104. var p2 = new Point2D(10,10);
  105. var v1 = new Vector2D(p1,p2);  //通过两个点(p1,p2)的方式来构造向量V1
  106. alert("向量v1长度:"+v1.length());
  107. var v2 = new Vector2D(0,0,5,5);  //通过四个坐标(x1,y1,x2,y2)的方式来构造向量V2
  108. alert("向量v2长度:"+v2.length());
  109. var v3 = new Vector2D(0,10);  //通过指定终点的方式来构造向量V3
  110. alert("向量v3长度:"+v3.length());
  111. alert("向量v1与v2的交积:"+v1.cross(v2));  //求V1 X V2 (因为平行,所以结果为0)

  112. var p3 = new Point2D(10,0);
  113. alert("点p1与p3的距离:"+p1.distance(p3));
  114. alert("点p3与向量v1的距离:"+p3.distance(v1));
  115. </script>
复制代码

[ 本帖由 月影 最后编辑于 2005-4-22 20:17 ]
 楼主| 发表于 2005-4-22 18:17:36 | 显示全部楼层
上面的代码中实现了两种类型的重载
首先是重载了构造函数Vector2D()
可以通过
new Vector2D(p1,p2)
new Vector2D(x1,y1,x2,y2)
new Vector2D(x,y)
三种方式构造向量
其次,在Point2D中重载了方法distance使之既可以求点到点的距离又可以求点到向量的距离
发表于 2005-4-22 18:40:20 | 显示全部楼层
呵,你给出的例子应该称为“选择性继承”吧。。
 楼主| 发表于 2005-4-22 20:12:55 | 显示全部楼层
并不是选择是继承哦
是经典的OOP中函数重载的实现...
var v1 = new Vector2D(p1,p2);
var v2 = new Vector2D(0,0,5,5);
var v3 = new Vector2D(0,10);
这三个是重载构造函数的例子

p1.distance(p3);
p3.distance(v1);
这两个是重载的函数方法

如果我没记错的话,C++中的函数重载采用了类似的思路
只不过通过编译器实现的
(可以参考《深度探索C++对象模型》一书)
发表于 2005-4-22 20:15:30 | 显示全部楼层
抱歉,没有看清楚。。。

我把你的代码贴到我的BLOG上,http://www.csing.net/view.aspx?lid=13,这样看就方便多了,呵呵。现在没空仔细研究,呆会有空了看完再来发表我的想法
 楼主| 发表于 2005-4-22 20:19:45 | 显示全部楼层
嗯、嗯 :)
您需要登录后才可以回帖 登录 | 加入无忧

本版积分规则

小黑屋|手机版|Archiver|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445   鄂公网安备 42011102000433号

GMT+8, 2019-1-24 15:50 , Processed in 0.083937 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表