JAVASCRIPT面向对象的设计.

面向对象编程里最基本的单元,就是类;而像JAVASCRIPT这样一种脚本语言,我们又怎么让她支持,面向对像编程呢?
在GOOGLE上随便找一个关于JAVASCRIPT面向对像的主题,多达亿万;在众多的解决方案中,都会提到"prototype",
的确,要想使JAVASCRIPT支持面向对象,"prototype"功不可磨.在网上找到的许多优秀方案中,大多比较复杂,对于初学者的确有点难度,这里我提供了一个最轻量级的方案.

1,JAVASCRIPT面向对象要解决的几个问题
1.1 构造器,以及构造器参数问题,
1.2 类的属性问题,
1.3 类的方法问题,
1.4 类的事件问题,
1.5 类的继随问题,
1.6 类的命名空间问题,
1.7 类的统一注册问题,
1.8 类的统一实例问题,

从下面的c#类开始解决问题.
namespace PriceReader (命名空间)
{
 /// <summary>
 /// Summary description for Class1.
 /// </summary>
 public class Class1:Class2 //继承
{
  public Class1()
  {
    //构造问题.
  }
  public void test() //方法 公共,私有,等等不同类型的方法.
  {
  }
 }
}

以上面的C#的类,JAVASCRIPT怎么实现呢?
1,解决命名空间
在javascript里,所有的对象都是Object 的一个实例,我们可以用Object 对角来解决命名问题。
var regNamespace = Function.prototype.registerNamespace = function (namespaces)
{
 var root = window;
 var nsParts = namespaces.split('.');
 for(var i=0;i<nsParts.length;i++)
 {
  var curPart = nsParts[i];
  if(!root[curPart])
  {
   root[curPart] = new Object();
  }
  root = root[curPart];
 }
}
上面的代码,利用object来产生命名空间,
用法
regNamespace("RSUN.Sys.UI");
2,解决继承,以及INTERFACE,ABSTRACT,等等类型的类.

Function.className = "-";
Function.classType = "class";
Function.baseClass = null;
Function.prototype.RegClass = function(className,baseClass)
{
 this.className = className.trim();
 if(baseClass)
 {
  this.baseClass = baseClass;
  this.prototype =  new baseClass;
 }
}
Function.prototype.RegAbstractClass = function(className,baseClass)
{
 this.RegClass(className,baseClass);
 Function.classType = "abclass";
}
Function.prototype.RegInterface = function(interfaces)
{
 this.RegClass(interfaces);
 Function.classType = "interface";
}
上面的代码,我们解决了继承,以及不同类型的class的注册,在这里可以将interface看成是一种特殊的class.

 综合实例:
regNamespace("RSUN.Sys.UI");

RSUN.Sys.UI = function()
{
    this.name = "";
}
RSUN.Sys.UI.RegAbstractClass ('RSUN.Sys.UI');//注册抽象的类
RSUN.Sys.UI.CheckBox = function()
{
    this.name = "chk1";
}
RSUN.Sys.UI.CheckBox.RegAbstractClass ('RSUN.Sys.UI.CheckBox',RSUN.Sys.UI)//注册类,并继承UI.
 
posted @ 2006-05-25 17:13  23热爱,自学业余码农。  阅读(204)  评论(0)    收藏  举报